2013-08-26 111 views
0

如果我有一個16位系統上得到1101 0010 0010 0010想將其轉換爲十進制的結果是-11,742(老師告訴我的)轉換二進制,十進制,六進制等位的作用是什麼?

但是,如果我輸入的二進制數到我的計算器我得到53794.

爲什麼會出現這種情況?系統(8位,16位,32位,64位)如何影響?

我試圖將二進制數轉換手(2 + 32 + 512 + 4096 + 16384 + 32768 = 53794),但只確認我的計算器....

+0

我認爲你的意思是整數(有符號),而不是小數。對? – williambq

回答

1

這是因爲計算機arhitmetic是基於two's complement

您768,16瞭解method of colpement

例如補小數自然減法看起來像這樣(用4位數字):

0000 
0001 - 
9999 = 

這是明顯是-1因爲在補充系統中第一位(當然在大頂端你應該熟悉endianness)定義符號。例如,在十進制補碼中,4是4,4是4,3是3,2是2,1是1,0是0,9是-1,8是-2,7是-3,6是-4和5是-5。

這是因爲在補碼系統中,你總是以相同的位數進行操作,但是除了忽略溢出結果之外,你總是加入和減少。例如具有兩個小數位:

 04 
     05 - 
...9999 = 

正如我告訴結果是隻有兩個數字(我們添加了兩位數字),所以結果是99.我還提到之前第一數量被解釋爲-1(未9) 。因爲它是位置數系統,我們可以這樣的結果很容易轉化爲我們的正常十進制系統只是通過正確的功率十大的總結數字multypling:

10^1 * 9 + 10^0 * 9 
//as I told - first nine is -1 so: 
10^1 * -1 + 10^0*9 = -10 + 9 = -1 

現在有了第一個結果嘗試:

9999 = 9 * 10^3 + 10^2 * 9 + 10^1 * 9 + 10^0 * 9 
//first nine is -1 so: 
-1 * 10^3 + 999 = -1000 + 999 = -1 

現在二進制它要簡單得多,因爲第一個數字只是告訴什麼是符號。試着用8位數:

這顯然-1,因爲如果我們添加1的結果將是0。你可以說我是因爲...鋪設你可以簡單地做如下補充:

1111 1111 
    0000 0001 + 
1 0000 0000 = 

但補體系統中不正確。這是因爲在補碼系統中,第一位數字不僅描述號碼的符號,而且所有號碼都可以無限擴大該位數!這就是id補碼99 = 9999的原因!這也意味着我們可以輕鬆擴展8個字節的數字,例如32個字節!

例如嘗試使用數字17和-1。你現在熟悉-1。在8個字節的二進制complemex -1:

擴充到32個字節它給了我們:

要它轉換成普通十進制我們需要做2^31 + 2^30 + ... + 2^0,但是(正如我所提到的),第一個1是-1,所以它恰好是-1 * 2^31 + 2^30 + .. + 2^0如果你計算這個,它就是-2147483648 + 2147483647 = -1!

0001 0001(十進制17)

擴充到32個叮咬得:

我們可以同意它仍然是17 :)

要提供我不是一些瘋狂的,只是IT學生我要提出的C++代碼完全是這樣的東西:

#include <iostream> 
using namespace std; 
int main(void) 
{ 
    char eightBits = 255; //eightBits := 0x11111111 
    int eightBytes = eightBits; //eightBytes becaming 255, right? 
    cout <<eightBytes <<endl; // MAGIC ! 
    return 0; 
} 
0

這裏的unpoken位是關於標誌。它存儲在前端並表示符號。

http://www.binaryconvert.com/result_signed_short.html?decimal=045049049055052050

更簡潔地,一個16位「字」或整數通常被稱爲在大多數系統中一個「短」和表示-32,768和32767之間符號數。這是您的老師所指的「二進制」數字,不是直接存儲爲二進制數字,而是以二進制格式存儲。實際上只有15個點用於存儲該值並且必須爲該符號保留一個點。否則,一個無符號的值可以使用全部16個點的數字,因此可以從0到+65,535。

1

基本上,它取決於有多少空間。最重要的位用於確定數字是否爲負數。

在一個32位的系統中,兩個下面的數字是等效的:

1101 0010 0010 0010 
0000 0000 0000 0000 1101 0010 0010 0010 

作爲符號的16位值時,1在開始表示,它是一個負數。爲了獲得它的價值,翻轉每一位,然後添加一個。

1101 0010 0010 0010 
0010 1101 1101 1101 
0010 1101 1101 1110 
= 11742 

作爲一個無符號 16位值,所有16位被用來確定幅度。這將導致53794.

Reference

0

有不同的方式來表示二進制數字:

  • 無符號(你在做什麼)
  • 簽名
  • 1的補
  • 2的補語(你應該根據你的老師做什麼)

數字系統通常使用2的補碼錶示法。

獲取二進制補碼的二進制數的十進制數:
1.第一位是符號位。如果數字以0開頭,則爲正數,否則爲負數。
2.如果數字是正數,則其十進制值是除符號位以外的其餘位的無符號值。如果數字是負數,則其絕對小數值=(剩餘比特補碼的有符號值)+1。

0

在計算機中,通常假定最左邊的位重複無限次數來表示「二進制補碼」有符號數,以便將位序列(1101 0010 0010 0010)視爲(1111 .. .1111 1101 0010 0010 0010)。儘管無限多的字符串可能看起來像一個無限大的數字,但向這樣的字符串加1會產生無限的零(即0)。因此,無限的一串是1的加法倒數,因此有效值爲-1。一個無限的字符串跟着一些零,將是單個1的加法逆,接着是這個零的數目(所以在你的例子中,最左邊的「1」的有效值是-32768而不是+32768) 。儘管將冪級數公式應用於1 + 2 + 4 + 8 + 16 + 32 + 64 ...產生-1這一事實常常被認爲是一種反常現象,但它與「二補」數學的工作方式一致。

注意的是,雖然補數學的許多描述簡單介紹一下這個最高位的「縮放因子」的符號爲被反轉(如-32768而非+ 32768),想着在左填充方面最左邊的副本位使得它更容易理解爲什麼有符號數字的行爲就像最左邊的數字是重複的那樣(例如,將一個負16位整數轉換爲一個32位整數,將最左邊的16位填充爲1)。

相關問題