2014-02-22 98 views
0

正如我們所知,字符的範圍是-128127關於字符範圍的混淆

-128的2的恭維和128二進制是一樣的,這是

千萬

那麼,爲什麼字符的範圍是-128127但不-127128
int,128-128的情況下兩者都不同。

+1

字符的範圍並不總是-128到127.即使你折扣C標準中有8個或更多位的部分,它可以是有符號或無符號的。也許你的意思是'int8_t'? –

回答

4

在二進制補碼錶示法中,每當所述高階位是1,數字爲負顯示出同樣的問題。所以,最大的正數爲

01111111 = 127 

,最小負數

10000000 = -128 

同樣的事情發生了int,但它的範圍要大得多。最大的利好int是

01111111 11111111 11111111 11111111 = 2147483647 

,最小負int是

10000000 00000000 00000000 00000000 = -2147483648 

正如你可以看到,在這兩種情況下,最小的負比最大的利好1以上。

您可能想知道,如果除符號位以外的位數相同,爲什麼有更多的負數比正數?這是因爲你不算0。它的高位爲0,所以在這個符號中被認爲是正值。如果包含這一點,則有128個負面字符和128個非負面字符,並且它們平衡。

+0

以'4294967234'爲例,它的二進制是'11111111111111111111111111000010'.它的高位是'1',那麼它是多麼的積極呢? – zee

+0

這是一個unsigned int,我們正在討論signed int。 – Barmar

+0

,或者它是一個「long long」,它是64位。 – Barmar

0

一個字符有8位。所以當你有8位處理時,-128和128的位模式是相同的。 (忽略符號位)

現在int。它有更多的位,所以MSB不是-128,而是取決於平臺的更大的數字。

它確實在「較高」數

0

看128

10000000 

但默認字符簽署編譯器將第一位爲符號位,對待沒有。 爲陰性,並計算其二進制補碼(因爲MSB是1)

2s complement is 
01111111 
     +  1 
10000000 

所以 - 128存儲 要存儲+128編譯器已經考慮9位是解釋

010000000 

這裏MSB對於正號沒有0。但大小是9位,這表明爲什麼字符只能容納高達+127,如果我們想要存儲+128,那麼將如上所述存儲-128