2014-03-19 119 views
1

爲什麼不是這樣的最小值:32位有符號整數的最小值?

11111111 11111111 11111111 11111111 

請幫助我理解這一點。

+2

這實際上很清楚他在問什麼。 – Maroun

+0

http://en.wikipedia.org/wiki/Two%27s_complement –

+0

[使用無符號來獲取最大值](http://ideone.com/366Zrb) – Sadique

回答

2

讓我們用一個3位的例子讓事情變得簡單。

表示爲3位二進制數的值0000

如果我們從0減去1,我們得到-1。如果我們從000減去1,我們得到111,因爲我們只有3位,所以借貸「下降」。

如果我們繼續減1,我們得到:

-1 111 
-2 110 
-3 101 
-4 100 

如果我們開始回到0並添加1,我們得到的正數:

+1 001 
+2 010 
+3 011 

但是,當我們嘗試添加另一個1,我們得到的代表-4而不是+4

這就像如果你試圖在汽車上放回里程錶會發生什麼。一旦你達到0,下一個數字將是9999999(或者里程錶上有很多數字),但這當然可以被認爲是-1的表示。當你回退得更遠時,這個數字將從所有9個數字中移除,但它會代表更多的負數值。我們可以說,如果最左邊的數字在0到4之間,那麼數字是正數,如果數字在5到9之間,那麼它是負數。隨着我們繼續倒退,我們最終將達到500萬,這是最負面的價值。因爲我們得到了4999999,我們認爲這是積極的(最積極的值),所以再次回頭導致溢出。順便說一句,這被稱爲10的補碼,Charles Babbage使用它來表示他的差異引擎中的負數。

4
11111111 11111111 11111111 11111111 
↑ 
MSB is 1 indicating that the number is negative 

實際上是-1。爲什麼?

要計算一個數字的two's complement,你翻轉所有位並添加1。這樣做是爲了你提出的將給予數:

00000000 00000000 00000000 00000001 

爲1,但符號爲負。所以你得到-1。

你可能也想嘗試:

10000000 00000000 00000000 00000000 

如果計算上述數字,你會得到:

01111111 11111111 11111111 11111111 flip 
00000000 00000000 00000000 00000001 + add 1 
----------------------------------- 
10000000 00000000 00000000 00000000 

這確實最小值。

+1

什麼是關於不使用2的補碼的系統或拱? – Sadique

+2

@ al-Khwārizmī我其實不太確定。喜歡有人知道回答你。 – Maroun

+1

@ al-Khwārizmī - 作爲暗示「11111111 11111111 11111111 11111111」的「-2 <-1」可能是以4字節表示的最小的負數(以及最大正數)。 ...雖然OP自己說32位有符號數。 –

2

從每位的「位置值」的角度考慮這一點。爲了空間的緣故,讓我們暫時考慮一個8位有符號整數,它的值可能在-128到+127之間。

在此整數是,從最低到最高顯著每一位的地方值:

  • 1(LSB)
  • +16
  • +32
  • +64(MSB)
  • -128(符號位)

這意味着最高值被表示爲01111111(127),和最低值被表示爲10000000(-128)。 11111111代表-1。

相同的原理適用於32位有符號整數,只是位置值較大(具體而言,符號位爲-2147483648)。

1

在帶符號整數中,MSB表示符號1 = -ve0 = +ve
所以,機器居然將它們存儲在範圍0x00000000 - 0xffffffff
不過既然是signed,它必須既包括積極和消極號,因此解釋登錄語言它改變[-0x0fffffff + 1, 0x0fffffff][0x10000000,0x0fffffff]

範圍是平分 - [-2^31,2^31-1]

相關問題