在16位C編譯器中,我們有2個字節來存儲一個整數,一個字符存儲1個字節。對於無符號整數,範圍是0到65535.對於有符號整數,範圍是-32768到32767.對於無符號字符,0到255.根據整數類型,不應將有符號字符範圍設置爲-128到127。爲什麼-127到127?剩下的一點呢?16位數據類型範圍內的混淆
回答
我覺得你混合了兩兩件事:
- 什麼範圍的標準需要
signed char
,int
等 - 什麼範圍在大多數硬件實現這些天。
只要實現的範圍是標準要求的範圍的超集,這些不一定必須相同。
根據the C standard,的SCHAR_MIN
和SCHAR_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
。
- 1. C數據類型混淆
- 2. 檢查範圍內的數據類型
- 3. node.js mongodb javascript範圍混淆
- 4. JavaScript中的數據類型混淆
- 5. 類型混淆?
- 6. 匿名函數範圍混淆
- 7. MySQL浮點類型範圍和精度混淆
- 8. C++ 11數據類型混淆
- 9. 配置單元數據類型混淆
- 10. 數據類型混淆用C
- 11. python輸出數據類型混淆
- 12. 參數類型混淆
- 13. Java類型參數混淆
- 14. 階類型參數混淆
- 15. 關於字符範圍的混淆
- 16. python中的混淆值範圍
- 17. 角度$範圍與$ watch的混淆
- 18. C#中可變範圍的混淆#
- 19. 泛型類混淆
- 20. 返回最大價值混合數據類型的範圍
- 21. Python類+數據包混淆
- 22. 與void *類型內存分配混淆?
- 23. Haskell類型類混淆
- 24. Maven + AssertJ + IntelliJ =與範圍混淆?
- 25. 初級Javascript - 可變範圍混淆
- 26. C++公共變量範圍混淆
- 27. Spring依賴注入範圍混淆
- 28. Angularjs繼承父範圍混淆
- 29. For循環變量範圍混淆
- 30. 在開始範圍內的Rails混淆id
謝謝你的解釋。 – 2012-07-30 10:33:58