回答
讓我們用一個3位的例子讓事情變得簡單。
表示爲3位二進制數的值0
爲000
。
如果我們從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使用它來表示他的差異引擎中的負數。
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
這確實最小值。
從每位的「位置值」的角度考慮這一點。爲了空間的緣故,讓我們暫時考慮一個8位有符號整數,它的值可能在-128到+127之間。
在此整數是,從最低到最高顯著每一位的地方值:
- 1(LSB)
- +16
- +32
- +64(MSB)
- -128(符號位)
這意味着最高值被表示爲01111111
(127),和最低值被表示爲10000000
(-128)。 11111111
代表-1。
相同的原理適用於32位有符號整數,只是位置值較大(具體而言,符號位爲-2147483648)。
在帶符號整數中,MSB表示符號1
= -ve
,0
= +ve
。
所以,機器居然將它們存儲在範圍0x00000000 - 0xffffffff
不過既然是signed
,它必須既包括積極和消極號,因此解釋登錄語言它改變[-0x0fffffff + 1, 0x0fffffff]
或[0x10000000,0x0fffffff]
。
範圍是平分 - [-2^31,2^31-1]
- 1. 32位有符號整數的最小值是多少?
- 2. 水平最小值和SSE中無符號32位整數的位置
- 3. Javascript中的無符號32位整數
- 4. GraphQL大整數錯誤:Int不能表示非32位有符號整數值
- 5. 使用AVX的最小有符號/無符號整數
- 6. 如何檢查c中的32位有符號整數的整數溢出
- 7. 算法使用32位無符號整數乘64位數
- 8. 32位無符號整數的2位右移
- 9. 兩個32位有符號整數使用SSE2相乘
- 10. 5位有符號整數?
- 11. HDF5寫出32位無符號整數到磁盤上的64位,並讀入32位無符號int
- 12. 如何將有符號的32位int轉換爲無符號的32位int?
- 13. 將32位無符號小尾數轉換爲javascript中的整數
- 14. 32位數組的最大大小?
- 15. 如何在32位處理器上使用一個有符號整數和一個無符號整數製作帶符號的64位整數
- 16. 用兩個無符號的16位整數表示一個無符號的32位值
- 17. 將值轉換爲無符號32位
- 18. Powershell,如何聲明一個無符號的32位整數?
- 19. 與對應的32位無符號整數
- 20. 位移爲32個64的無符號整數
- 21. 在Redis中存儲32位有符號整數的內存有效方式
- 22. 在一個無符號的32位整數中查找位的位置
- 23. 在32位整數
- 24. 64位有符號整數有多大?
- 25. 有符號整數的按位操作
- 26. Delphi XE 32位有符號表示法
- 27. 32位無符號整數(大端)轉換爲長和後
- 28. PHP:鑄造長期或無符號整數與32位
- 29. 計算有符號整數的最大大小
- 30. 將bitstring轉換爲32位有符號整數會產生錯誤的結果
這實際上很清楚他在問什麼。 – Maroun
http://en.wikipedia.org/wiki/Two%27s_complement –
[使用無符號來獲取最大值](http://ideone.com/366Zrb) – Sadique