调用<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