為什么 C 語言中 short int (若為16位)變量的取值范圍是 -32768 ~ 32767 ??? 而並不是 -32767 ~ 32767.
1. 最高位為符號位;最高位為0表示正數,最高位為1表示負數;
2. 若以原碼表示,16位二進制原碼最大為 0111 1111 1111 1111 = 215 - 1 = 32767, 最小為 1111 1111 1111 1111 = -(215 - 1) = -32767, 0 有兩種表示方法,即正0 (0000 0000 0000 0000)和負0 (1000 0000 0000 0000);
3. 計算機中采用二進制補碼存儲數據;其中正數的補碼 = 原碼,負數的補碼 = 反碼 + 1;
4. 若以反碼表示,16位二進制范圍
正數: 0000 0000 0000 0001 ~ 0111 1111 1111 1111 (1 ~ 32767)
正 0: 0000 0000 0000 0000
負 0: 原碼 1000 0000 0000 0000, 補碼 1111 1111 1111 1111 + 0000 0000 0000 0001 = (1) 0000 0000 0000 0000
負數:
原碼:1111 1111 1111 1111 (-32767),補碼:1000 0000 0000 0000 + 0000 0000 0000 0001 = 1000 0000 0000 0001
原碼:1000 0000 0000 0001 (-1), 補碼:1111 1111 1111 1110 + 0000 0000 0000 0001 = 1111 1111 1111 1111
請注意,再以補碼表示的16位二進制數中,0表示為 0000 0000 0000 0000,正數范圍為 (0000 0000 0000 0001 ~ 0111 1111 1111 1111),負數范圍為 (1000 0000 0000 0001 ~ 1111 1111 1111 1111);其中還有一個補碼 1000 0000 0000 0000尚未用到,於是人為的將這個補碼定義為實際中的數字 -32768.