2012-07-27 60 views
5

在16位C編譯器中,我們有2個字節來存儲一個整數,一個字符存儲1個字節。對於無符號整數,範圍是0到65535.對於有符號整數,範圍是-32768到32767.對於無符號字符,0到255.根據整數類型,不應將有符號字符範圍設置爲-128到127。爲什麼-127到127?剩下的一點呢?16位數據類型範圍內的混淆

回答

15

我覺得你混合了兩兩件事:

  1. 什麼範圍的標準需要signed charint
  2. 什麼範圍在大多數硬件實現這些天。

只要實現的範圍是標準要求的範圍的超集,這些不一定必須相同。

根據the C standard,的SCHAR_MINSCHAR_MAX實現定義的值必須在大小(絕對值)到,並且相同的符號的相等或更大:

SCHAR_MIN -127 
SCHAR_MAX +127 

僅即255值,不是256

但是,由兼容實現定義的限制可能會比這更大。即標準也允許[-128,+127]。而且由於大多數機器都代表2's complement form中的數字,所以最常見的範圍是[-128,+127]

實際上,由C標準定義的int甚至最小範圍是對稱約爲零。它是:

INT_MIN -32767 
INT_MAX +32767 

只有65535個值,不65536

但是,大多數機器再次使用2's complement表示,這意味着它們提供範圍[-32768,+32767]

雖然在2's complement form有可能表示8位中的256個有符號值(即[-128,+127]),但還有其他有符號的數字表示,這是不可能的。

sign-magnitude representation,一個比特被保留用於星座,所以:

00000000 
10000000 

兩個意思是一樣的,即0(或更確切地說,+0-0)。

這意味着,一個值被浪費了。因此,符號幅度表示只能保持8位中的-127(11111111)到+127(01111111)之間的值。

one's complement representation(不這樣做按位否定):

00000000 
11111111 

都意味着同樣的事情,即0

同樣,只有從-127(10000000)到+127(01111111)的值可以用8位表示。

如果C標準要求範圍爲[-128,+127],那麼這基本上會排除使用這種表示的機器能夠有效地運行C程序。他們需要一個額外的位來表示這個範圍,因此需要9位來存儲有符號的字符而不是8.基於上述的邏輯結論是:這就是爲什麼C標準要求[-127,+127]用於簽名字符。即允許實現自由地選擇適合其需要並且同時能夠以有效方式遵守標準的整數表示的形式的自由。同樣的邏輯也適用於int

+0

謝謝你的解釋。 – 2012-07-30 10:33:58