C語言基本類型(char、short、int、long)均分為有號(signed)與無號(unsigned)兩種,浮點型(float、double)僅有有號版本。各類型的取值範圍由其二進制位寬與編碼方式決定。本文以 char(1 byte = 8 bits)為例,詳細推導其範圍 -2^7 ~ 2^7-1 的由來。
若採用原碼:最高位為符號位(0 正、1 負),其餘 7 位為數值。
最大正數:01111111 = 2^7-1
最小負數:11111111 = -(2^7-1)
問題:10000000(-0)與 00000000(+0)皆代表 0,浪費一個編碼,且加減運算需單獨處理符號位,硬體實現複雜。
現代計算機統一採用補碼存儲:
00000000 代表 +0)。以 -1 為例:原碼 10000001 → 取反 11111110 → 加 1 → 11111111。
關鍵點:10000000(原碼 -0)的補碼運算結果為 00000000,與 +0 合併。因此 10000000 騰出來,人為規定其代表 -2^7(即 -128)。
| 類型 | 位寬 | 有號範圍 | 無號範圍 |
|---|---|---|---|
| char | 8 | -128 ~ 127 | 0 ~ 255 |
| short | 16 | -32768 ~ 32767 | 0 ~ 65535 |
| int | 32 | -2^31 ~ 2^31-1 | 0 ~ 2^32-1 |
同理可推導其他整數類型。理解補碼機制不僅有助於掌握範圍,更能解釋溢出行為、位運算結果等底層現象。