关于负数为什么用补码的原因
可以参考这篇文档(写得还是不错的):补码原理
整数(区别于浮点数)的存储
- 正数:存的是本身
- 负数:符号位不变,数值位取反码,再加一
-0与+0的存储
比如8位的-0
- 原码: 1000 0000
- 反码: 1111 1111
- 补码:1 0000 0000
计算机的存储 :0000 0000(符号位舍去了)
比如8位的+0
- 原码: 0000 0000
- 反码: 0000 0000
- 补码: 0000 0000
计算机的存储 :0000 0000
-128的存储
问题:8位为什么可以表示 -128到+127?
-
解释一:8位补码组合有256种
0000 0000- 0111 1111 -> 0到+127
1000 0000 (用来干嘛?不能让它空着,多浪费,只好用来表示-128)
1111 1111-1000 0001 -> -1到-127 -
解释二:
原码 补码 值
0111 1111 0111 1111 +127
* * *
* * *
不断减1 不断减1
0000 0000 0000 0000 0
1000 0001 1111 1111 -1
* * *
* * *
1111 1111 不断减1
1111 1111 1000 0001 +127
无法表达 1000 0000 +128
-
解释三:
计算机中只有加法,减一数 等于加这个数的补码
256-128=128
256-(128的补码)=128
(128的补码)=256-128
=128(1000 0000)