共计 686 个字符,预计需要花费 2 分钟才能阅读完成。
原码
原码是十进制数据的二进制表现形式,最左边是符号位,0 为正,1 为负。
最大值 127 的原码为 0111 1111
。
最小值 -127 原码为 1111 1111
。
利用原码对正数进行计算不会有问题,但如果是对负数计算,结果就出错。
1000 0000 -0
+ 0000 0001 +1
-----------
1000 0001 -1(正确值:+1)
反码
为了解决原码不能计算负数的问题,出现了反码。
正数的反码不变,负数的反码符号位不变,其余位取反,0 变 1,1 变 0。
十进制数字 | 原码 | 反码 | 补码 |
---|---|---|---|
+0 | 0000 0000 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 | 0000 0000 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
-2 | 1000 0010 | 1111 1101 | 1111 1110 |
… | … | … | … |
-127 | 1111 1111 | 1000 0000 | 1000 0001 |
-128 | 无 | 无 | 1000 0000 |
反码也有弊端,在进行负数计算的时候,如果结果不跨 0,是没有问题的,但是如果结果跨 0,跟实际结果会有 1 的偏差。
1111 1101 -2 | 1111 1101 -2
+ 0000 0010 +2 | + 0000 0011 +3
----------- | ---------
1111 1111 -0 | 0000 0000 +0(正确值:+1)
补码
虽然 + 0 和 - 0 是一样的,但 0 带符号没有任何意义,而且会有两个反码表示 0。于是补码的出现,解决了 0 的符号以及两个编码的问题,解决了负数计算跨 0 的问题。
正数的补码不变,负数的补码在其反码的基础上 +1。补码能多记录一个特殊值 -128,该数据在 1 个字节下,没有原码和反码。
计算机中的存储和计算都是以补码的形式进行的。
正文完