计算机在存储数字时,以最高位作为数值符号进行存储,0表示正数,1表示负数,同时,计算机的最小存储单位是8位
原码
所谓原码,就是将数值转化为二进制,如下将1、-1、0转为二进制
+1: 0000 0001
-1: 1000 0001
+0: 0000 0000
-0: 1000 0000
如上,如果计算机使用原码进行存储数值,将会导致有两种0的结果。
此时计算1 - 1的结果:
// 以原码计算1 - 1
1 - 1 = 1 + (-1)
+1: 0000 0001
-1: 1000 0001
1000 0010 => -2
以上,发现以原码的方式存储除了会导致有两种0之外,连计算结果都不准确。因此,虽然原码更容易被人理解,但对于计算机来说,反而不好处理。
反码
反码是为了补码而产生的
- 先获取原码
- 正数的反码就是原码
- 负数的反码,是在原码的基础上,符号位不变,其他位取反
如下,求得+1、-1、+0、-0的反码
+1: 0000 0001 //正数的反码与原码相同
-1: 1111 1110
+0: 0000 0000
-0: 1111 1111
如上,此时0依然有两种形式,此时计算1 - 1
// 以反码计算1 - 1
+1: 0000 0001
-1: 1111 1110
1111 1111 => -0
以上,发现以反码进行计算,计算结果正确,但是反码依然有缺陷,它还是有两种形式的0存在。
补码
获取原码
获取反码
正数的原码、反码、补码都是一致的
负数的补码,在反码的基础上+1
如下,求得+1、-1、+0、-0的补码
+1: 0000 0001
-1: 1111 1111
+0: 0000 0000
-0:10000 0000
如上,发现-0的补码为10000 0000
,由于计算机的存储单位是8位,所以超过8位的高位部分将被丢弃,所以,真正的-0的补码为0000 0000
,与+0是一致的!
所以,补码的方式解决了存在两种0的问题,下面再看看补码的情况下,计算结果是否正确
+1: 0000 0001
-1: 1111 1111
10000 0000 => 丢弃高位,最终结果为0000 0000,即0
运算结果正确!
嗯。