日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

INT_MAX INT_MIN及其运算

發布時間:2024/3/12 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 INT_MAX INT_MIN及其运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:知乎阿貴

C++中常量INT_MAX和INT_MIN分別表示最大、最小整數,定義在頭文件limits.h中。

#define INT_MAX 2147483647 #define INT_MIN (-INT_MAX - 1)

因為int占4字節32位,根據二進制編碼的規則,INT_MAX = 2^31-1,INT_MIN= -2^31.

在C/C++語言中,不能夠直接使用-2147483648來代替最小負數,因為這不是一個數字,而是一個表達式。表達式的意思是對整數21473648取負,但是2147483648已經溢出了int的上限,所以定義為(-INT_MAX -1)。

上溢是2147483647很容易理解,2147483647=2^31-1 (因為要有一個符號位,所以把第一位作為符號位,0為正,1為負),但為什么下溢的時候分明是31位來表示的數會出現2147483648呢??

以八位整數為例

00000000到01111111,表示0到+127。10000001到11111111,表示-1到-127。大家可以注意到,10000000我們沒有用到。因為如果我們把它看成-0,那么會和00000000發生重復。于是計算機將10000000定義為-128(即在最終進位后符號位不產生進位)。

(1) 對于無符號n位整數,表示范圍很好理解[0 ~ 2^n?1];

(2) n位有符號整數的表示范圍為[?2^(n?1) ~ 2^(n?1)?1],對于有符號整數,計算機使用補碼表示,同時在表示時采用了下面的準則:

最高位為符號位,正數為0,負數為1;
正數的反碼以及補碼與原碼相同;
負數需要對除符號位以外的所有位取反得到反碼,然后反碼加1得到補碼。

首先從原碼講起,原碼即為計算機中對數值的二進制表示,如 5用二進制表示為0000 0101 ;

其次就是反碼,反碼,顧名思義取反,對于正數來說,反碼與原碼相同;對于負數來說,反碼為原碼的各位取反(符號位除外),如

正數(0011 0111)的反碼為: 0011 0111 ,

負數(1101 0010)的反碼為: 1010 1101 ;

再次就是補碼,計算機中,數值疑慮用補碼表示和存儲的,正數的補碼與原碼相同,負數的補碼為其反碼+1,如

正數(0101 1101)補=0101 1101

負數(1101 0010)補=1010 1110

由于計算中的CPU只有加法器,沒有減法器,所以在計算機采用原碼做減法是會存在這樣的問題:對于1-1=0

看做1+(-1)=0 二進制表示 0001+1001=1001 變成了十進制的負1而不是0。

補碼的出現很好的解決了這個問題,由于采用補碼運算,則

補碼加法成為:[X+Y]補 = [X]補 + [Y]補

補碼的減法變為:[X-Y]補 = [X]補 - [Y]補 = [X]補 + [-Y]補

補碼的乘法變為:【X*Y】補=【X】補×【Y】補;

在此我們以減法為例說明補碼的優勢,還以上述為題為例:(0001)補+(1001)補 = 0001 + 1111 = 0000 (最高位的進位省略),這樣就順利得到了0

另外,補碼還解決了原碼中存在兩個0 的問題(即+0 和 -0),以8進制為例,int_8的取值范圍應該是-127~ -0和+0~ 127 即存在(正0): 0000 0000 和 (負 0):1000 0000 ,但是在兩個0轉換為補碼后全部都變成了0000 0000,

但是這樣就會有一個補碼(1000 0000 )沒有用到,對于1000 0000 ,任何原碼都不能轉換成補碼后成為1000 0000的形式。所以人為規定補碼中 1000 0000 表示 -128 ,這就很好的解釋了,為什么8位的整形變量的下溢下界會是-128而上溢上界是127了。

同樣,對于16進制int,也是這樣, 表示范圍成了 - 32768 ~ 32767 (32768=2^16)

關于INT_MAX INT_MIN的運算

由于二進制編碼按原碼、補碼和反碼的規則進行運算,所有程序中對INT_MAX和INT_MIN的運算應當格外注意,在出現溢出的時候,不遵循數學規則。

INT_MAX + 1 = INT_MIN

0111 1111 + 0000 0001 = 補碼 0111 1111 + 補碼0000 0001 = 補碼 1000 0000 = -128

INT_MIN - 1 = INT_MAX

INI_MIN + 1000 0001 = 補碼1000 0000 + 補碼 1111 1111 = 補碼 0111 1111 = 127

abs(INT_MIN) = INT_MIN

比較有趣的是,INT_MAX + 1 < INT_MAX, INT_MIN - 1 > INT_MIN, abs(INT_MIN) < 0.

總結

以上是生活随笔為你收集整理的INT_MAX INT_MIN及其运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。