int_32的最大值與最小值(C/C++)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM