INT_32的最小值
十進制表示為$-2147483648$,轉化為二進制:$1000 0000 0000 0000 0000 0000 0000 0000$。
第一位$1$既是符號位,也是數值位:$-2_31 = 2,147,483,648$。
INT_32的最大值
十進制表示為$2147483647$,轉化為二進制:$0111 1111 1111 1111 1111 1111 1111 1111$。
$2147483647 = 2_{30} + 2_{29} + 2_{28} + ... + 2_3 + 2_2 + 2_1 + 2_0$。
【注意:INT_32中最小值(負數)的絕對值比最大值(正數)的絕對值大1。】

計算機中的原碼、反碼與補碼
在計算機系統中,數字都是以二進制補碼的形式進行存儲的。
(1)正數的原碼、反碼、補碼保持一致。
(2)負數的原碼,第一位為符號位(0表示正數,1表示負數)。
反碼:符號位不變,后續各位取反。
補碼:符號位不變,在反碼的基礎上加1(最后一位)。
幾個特殊的補碼
+0的補碼:$0000 0000 0000 0000 0000 0000 0000 0000$
-0的補碼:
| 原碼 | 1000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 |
| 反碼 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 |
| 補碼 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 |
即+0和-0的值在計算機系統是一致的。
0取反的結果:
| 0的原碼 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 |
| ~0(按位取反) | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 |
| ~0轉化為十進制 | 1000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0001 |
即~0 = -1。
按位移動
以下是在GCC下驗證的結果,不同的編譯器結果可能不一樣。
按位左移:對於有符號數,符號位保持不變,其它位是邏輯左移。對於無符號數,所有位都是邏輯左移。
按位右移:對於有符號數,符號位保持不變,其它位是邏輯左移。對於無符號數,所有位都是邏輯左移。
| -9(原碼) | 1000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 1001 |
| -9(反碼) | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 0110 |
| -9(補碼) | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 0111 |
| 右移1位 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1011 |
| 輸出(反碼) | 1000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0100 |
| 輸出(補碼) | 1000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0101 |
十進制輸出:-5。
參考資料:
https://blog.csdn.net/ccozkf/article/details/104061067
