数据的机器表示–补码反码浮点数等
参考:《计算机系统基础》(袁春凤版)
工具
如何查看各种int,long的数值范围:
#include<limits>
long MAX64 =( numeric_limits<long>::max)();
其余同理
补码、反码
- 原码:
- 1个符号位 + 值位: 0为正数,1位负数
- 补码:
- 正数的补码:自身不变;
- 负数的补码:符号位不变,其余"按位取反,末尾加一";
- 反码:
- 正数的反码:自身不变;
- 负数的反码: 符号位不变,其余“按位取反”;
1.如何根据补码、反码求其原码?
将以上定义倒过来套用即可
如x的补码是'1001 0110', 则x的原码是符号不变,按位取反末尾加一
除去符号位是'10110',按位取反是'1001',末尾加一是'1010', 结果是-10
2. 32位int的范围?
-2^32 到 2^32-1
十六进制表示为: 0x80000000 ~ 0x7FFFFFFF
换成二进制观察:-2^32: 0B1000 0000 0000 0000 ...
2^32-1: 0B0111 1111 1111 1111 ...
3. 32位int下,取x=-2^31,则x-1的正负?
显然x-1发生了溢出,但要判断溢出后的符号位是0还是1
x的二进制表示为:1000 0000 0000 ...
x-1的二进制为:0111 1111 1111 ...,此时x-1的值等于2^32,即int的最大值
4. 0的补码和反码?
0分别+0和-0
区别在于不同的符号位会影响取反码和补码
+[0] = 0000 0000; 反码,补码都为0:
-[0] = 1000 0000; 反码=1111 111(即-1), 补码=0000 0000
4. x和~x之间的关系?
x + ~x == -1
证明:...