調用<limits.h>
INT_MIN, INT_MAX
利用原碼、補碼、反碼及位運算
- 機器數與真值
機器數:在計算機中實際存儲的數,如0000 0001
真值:去掉符號位,根據編碼規則推導出的真實值 - 原碼
原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其余位表示值。(一種非常容易理解的方式)
正負1的原碼表示:
[+1] = 0000 0001
[-1] = 1000 0001
8位二進制數,原碼能表示的范圍為:
[0111 1111 1111 1111]---->[2^7-1 -2^7-1]---->[-127 127]
- 反碼
反碼就是在原碼的基礎上,符號位不變,其余位取反。 (顯然,正數的反碼還是本身)
正負1的反碼表示:
[+1] = 0111 1110
[-1] = 1111 1110
- 補碼
正數的補碼就是本身,復數的補碼就是其反碼加一
正負1的補碼表示:
[+1] = 0000 0001 (補)
[-1] = 1111 1110(反)= 1111 1111(補)
- 為什么要用補碼進行運算?
將減法簡化為加法(減去一個正數等於加上這個正數的相反數),且保持只有一個0的表示。(https://blog.csdn.net/wo17fang/article/details/52241682)
6.表示最大最小的整數
看了上面的解釋,下面的定義就是自然而然了
int max_int = 0b0111 1111 1111 1111;
int min_int = max_int+1;
進一步簡寫為:
#define MAX_INT (((unsigned int)(-1))>>1)
#define MIN_INT MAX_INT+1