19

我讀 Why is the range of bytes -128 to 127 in Java? 它說爲什麼有符號字節的範圍是從-128到127(2的補碼),而不是從-127到127?

128 10000000倒,它是01111111,並添加一個得到 千萬再次

所以它的結論是-128千萬

如此+ 128不能用8位的二進制補碼錶示,但這意味着我們可以用9位表示,所以128是010000000,所以取其2的補碼-128是110000000,

因此是-128 10000000或110000000的表示? 代表位是否依賴?

爲什麼不簡單地使低範圍-127 fot 8位而不是將-128寫爲10000000?

回答

34

爲什麼無符號字節的範圍是從-128到127?

不是。 (假定8比特)的一個無符號字節是從0到255

一個的範圍簽署使用2的補字節是從-128到127,直接從的2's complement定義:

01111111 = +127 
01111110 = +126 
01111101 = +125 
... 
00000001 = +1 
00000000 = 0 
11111111 = -1 
... 
10000010 = -126 
10000001 = -127 
10000000 = -128 

所以是表示-128 10000000或110000000?

在8位,它是10000000,在假設的9位表示它是110000000

爲什麼不簡單地將8位的低位範圍-127?

人爲地限制範圍到-127不會達到很高的程度;你會拒絕一個完全有效的值,並且通常會使代碼更加複雜(你還會對位模式10000000做什麼?)。

+3

當我開始寫我的答案,你的答案是一個班輪。現在我看到它大部分已經廢棄了我的答案。你總是這樣做嗎?我的意思是回答一個班輪來搶先響應者的地方,然後逐漸改進?看看你的REP,我想你很擅長這種技術。 +1 – Aftnix 2012-07-11 13:59:18

+1

@Annix:這本來是一個單行的,因爲我認爲這就是所有需要的問題。然後有人低估了它,所以我認爲我應該改進它! – 2012-07-11 14:00:13

+0

對不起,我的意思是沒有進攻。 – Aftnix 2012-07-11 14:02:50

6

以二進制補碼的替代品將是

  • one's complement,其由於其「零負」
  • sign/magnitude,其中也有一個負零
  • 沒有意義分配給10000000問題,在這種情況下,接受帶符號8位整數的許多函數將不得不檢查該無效值,從而浪費時間。 (除非您的代碼運行在假設的硬件上,該硬件將此位模式視爲整數NaN)

只給該位模式指定一個含義比較容易,而且二進制補碼錶示中的自然含義是-128 。

例如,在二的補碼中,檢查是否爲負值檢查其最高位是否設置。在一個變體,其中10000000是無效的,它的(僞)

if (highest_bit_zero(x)) 
    return false; 
else if (x == 0b10000000) 
    ERROR 
else 
    return true; 

你決定如何處理錯誤:)

+0

另一個主要的選擇是符號/大小,它也有一個負的零。 ISO C和C++標準都指定有符號整數類型可能是二進制補碼,補碼或符號/幅度。 – 2017-07-10 00:58:33

+0

如果你只是不允許'-128',你可以把它當作一個NaN,就像浮點一樣。如果您使用與IEEE FP相同的語義,則比較可能會有4個結果:大於,等於,小於或無序。所以如果'x'是'0x80','x <0'將是錯誤的(無序)。但'x> 0'也是錯誤的,所以'x == 0'也是。所以會'x == x'。 – 2017-07-10 01:01:12

3

所以是-128 10000000之間或1.1億的代表性?代表位是否依賴?

在9位的世界,這將是110000000.在16位的世界,這將是1111111110000000.至少,只要我們談論的二進制補碼。

爲什麼不簡單地使低位範圍-127爲8位而不是-128爲10000000?

正如larsmans指出的那樣,您最終會得到一個「無效」的值,您必須經常檢查該值。我們選擇了二進制補碼,因爲ALU很容易處理。就像字節寬度被選爲二的冪次(這並不總是這種情況)。在硬件層面上,二進制補碼與無符號相同,因此不需要特殊指令或額外的硬件(與補碼不同)。

隨着事情的發展,所有具有最高位設置的值都是負數,所有最高位未設置的值都是非負數(正數或零)。很簡單,不是嗎?負範圍比正範圍大一個簡單地是試圖保持二補碼簡單的人造物。

15

so is representation of -128 10000000 or 110000000?代表位是否依賴?

是,2的補碼錶示爲比特依賴

爲什麼不能簡單地使較低的範圍內,而不是寫-128作爲千萬

2^8 = 256 -127 FOT 8位。因此,無論您使用何種表示方式,它都應該能夠表示256個不同的值。

你可以畫一個圓圈來理解2補碼系統有多好。

首先看一下這個表:

Bits Unsigned 2's complement 
00000000 0 0 
00000001 1 1 
00000010 2 2 
01111110 126  126 
01111111 127  127 
10000000 128  −128 
10000001 129  −127 
10000010 130  −126 
11111110 254  −2 
11111111 255  −1 

2的補體系統可以畫出圓圈理解這個系統。

這裏是4位版本。您可以輕鬆開發自己的8位版本。這個圓圈表示這個2的補碼系統實際上是什麼。它是一個循環系統。這意味着它的表示取決於你給它的「跨度」。這就是爲什麼8位版本的負數將與16位版本的相同負數不同。您可以將圓圈中給出的4位版本中的相同負數與表中給出的8位版本進行比較。

     0000 0 
       1111 -1  0001 1 


     1110 -2      0010 2 




    1101 -3         0011 3 



1100 -4          0100 4 



    1011 -5         0101 5 




     1010 -6      0110 6 


       1001 -7  0111 7 
          1000 -8 

在附註中,2的補碼運算在計算機(寄存器,存儲器等)中的「固定」寬度計算存儲器中起到很好的作用。

在第一代計算機中,有提供原生十進制算術的趨勢。但是這很快就被拋棄,轉而採用「補充」或「循環」方案,因爲從計算機的角度來看,十進制算術是離奇的。我們發現它很自然,因爲「我們有10個手指」。這些手指是我們的祖先最早的計算工具。這就是爲什麼我們發現十進制系統如此自然。它嵌入到我們的基因中。

+1

+1要使用更多的數學語言,2s補碼有符號和無符號只使用不同的代表進行算術模256.這意味着加法和乘法會產生相同的位模式,而與有符號或無符號表示無關。 – starblue 2012-07-12 20:45:17

+0

*這意味着它的表示取決於您給它的「跨度」。*但模式非常簡單。將符號擴展爲更寬的類型意味着將高位複製到所有新位。 – 2017-07-10 01:22:29

+0

Ditto @starblue使用二進制補碼的優勢 - 來自[Wikipedia](https://en.wikipedia.org/wiki/Two%27s_complement):「*數字及其二進制補碼的總和將始終等於0 (因爲最後一個數字被截斷),並且數字和它的補碼之和將始終等於-0。這個二進制補碼系統的優點是加法,減法和乘法的基本算術運算與無符號二進制數*「。 – ruffin 2017-09-21 12:10:31

2

原因爲什麼你不能有範圍從enter image description hereenter image description here

它看起來像enter image description hereenter image description here是由相同的模式。不是很好。非零整數及其負數不能用相同的模式表示。所以enter image description here不能用八位表示。可以用8位表示的最大正整數是enter image description here

什麼數字由1000 0000表示?的enter image description here表示添加到它:

enter image description here

一個很好的選擇呢?是enter image description here。因此1000 0000代表enter image description here。八位可用於表示數字enter image description here ... 0 ... enter image description here

enter image description here

例如,利用二的補碼,可以以8位來表示的整數的範圍是:

Example

注意,一個更負的整數可以比正整數來表示。

來源: - http://programmedlessons.org/AssemblyTutorial/Chapter-08/ass08_20.html