原码、反码、补码 在线计算:http://www.atoolbox.net/Tool.php?Id=952
1、计算机中都是用 "补码" 表示
在计算机系统中,数值一律用 补码 来表示(存储)。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
- 正数 的 " 原码、反码、补码 " 相同
- 负数用补码表示。如果 负数也用原码表示,对于 8位二进制来说,表示范围就只有255个数, -128无法表示。
8位 二进制 的 表示法的数据范围:
原码: -127 ~ 127 1 111 1111 到 0 111 1111
反码: -127 ~ 127
补码: -128 ~ 127
2、原 码
最高位:是0表示正数,是1表示负数。
将 最高位 做为 符号位( 0代表正,1代表负,其余各位代表数值本身的绝对值
+7 的 原码:0 000 0111
-7 的 原码:1 000 0111
3、反 码
一个数如果值为正,那么反码和原码相同
一个数如果为负,那么符号位为1,其他各位与原码 " 数值位 " 相反。
+7 的 反码:0 000 0111
-7 的 反码:1 111 1000
解释:要得到 -7 的反码,首先的看 +7 的数值位,+7 的数值位是 000 0111,数值位取反得到 111 1000,然后在添加上 符号位,即可得到 -7 的反码为 1 111 1000
3.1 +0 和 -0
按照反码规则,这时就出现了 +0 和 -0 :
+0 和 -0 的 原码 :
- +0 原码:0 000 0000
- -0 原码:1 000 0000
+0 和 -0 的 反码
- +0 反码:0 000 0000
- -0 反码:1 111 1111
4、补 码
" 原码、反码 " 都不利于计算机的运算。
比如:原码表示的 7 和 -7 相加,还需要判断符号位。同时只有一个 0,但是0的反码却分为 +0 和 -0
补码 的 补码 就是 原码,有点负负得正的意思。
补码运算:
- 正数:" 原码,反码、补码 " 都相同
- 负数的补码 是 负数原码的数值位取反,然后带上符号位加 1。( 负数的补码:符号位不动,其他位求反,最后整个数 + 1,得到原码 )
-7 的补码:=
1 000 0111 (原码)
1 111 1000 (反码) 符号位不变,原码的数值位 000 0111 取反 得到 111 1000
1 111 1001 (补码)
解决 +0 和 -0 问题
求负数的补码时,取反后,加1时 需要符号位参与运算
+0 的 补码 为 00000000
-0 的 补码 也是 00000000
原码 | 反码 | 补码 | ||
0 | +0 | 0 000 0000 | 0 000 0000 | 0 000 0000 |
-0 | 1 000 0000 | 1 111 1111 | 1 111 1111 + 1 0 000 0000 ( "最高位的进位" 被舍弃 )说明:符号位不变,其他位取反得到 1111 1111,然后加 1(符号位参与运算,即整个数加1) 得到补码 0000 0000 ,所以 +0 和 -0 补码一样 | |
1 | 1 | 0 000 0001 | 0 000 0001 | 0 000 0001 |
-1 | -1 | 1 000 0001 | 1 111 1110 | 1 111 1110 + 1 得到补码 1 111 1111 |
127 | 127 | 0 111 1111 | 0 111 1111 | 0 111 1111 |
-127 | -127 | 1 111 1111 | 1 000 0000 | 1 000 0000 + 1 得到补码 1 000 0001 |
当 +0 和 -0 补码统一都为 0000 0000 后,还有一个 1000 0000 没有对应数字,于是规定 -128 的补码是 1000 0000,可以理解为是一个特殊性。
可以看到 -128 没有 原码、反码,所以是直接规定的 -128 的补码是 1000 0000
这样规定后,负数的补码在机器中就好算了。在约定的范围内( -128 --- +127,对16位32位64位等扩大范围)
先将该负数取绝对值,再用二进制表示出这个绝对值 (不管符号位),对该二进制数进行取反加一操作就得到负数的补码了
-128 绝对值是 128
128的二进制表示为:
1000 0000
取反
0111 1111
加1
1000 0000
这就是-128的补码
这种办法算出的结果符合 “规定值”,规定而已。
4.2 补码运算(加减)
求一个负数的补码时,取反后,加1时需要符号位参与运算,
补码运算(加减)也需要符号位参与运算
补码运算要注意的问题:
- 1. 补码运算时,其符号位与数值部分一起参加运算。
- 2. 补码的符号位相加后,如果有进位出现,要把这个进位舍去(自然丢失)。
- 3. 用补码运算,其运算结果亦为补码。在转换为真值时。
若符号位为0,数位不变;
若符号位为1,应将结果求补才是其真值。
-7 的补码:=
1 000 0111 (原码)
1 111 1000 (反码)
1 111 1001 (补码)
两个补码运算(加减)符号位参与运算。
+7 补码 0000 0111
-7 补码 1111 1001
+7 的补码 加 -7 的补码
0000 0111
+ 1111 1001
------------------------------
1 0000 0000 ( 符号位进位舍弃 )
因为计算机中运算器的位长是固定的,上述运算中产生的最高位进位将丢掉
溢出及补码溢出的判断
无论采用何种机器数,只要运算的结果大于数值设备所能表示数的范围,就会产生溢出。 溢出现象应当作一种故障来处理,因为它使结果数发生错误。异号两数相加时,实际是两数的绝对值相减,不可能产生溢出,但有可能出现正常进位;同号两数相加时,实际上是两数的绝对值相加,既可能产生溢出,也可能出现正常进位。
由于补码运算存在符号位进位自然丢失而运算结果正确的问题,因此,应区分补码的溢出与正常进位。
补码运算
用补码进行运算,减法可以通过加法实现 |
7-6=1 (7 的补码 和 -6 的补码 相加) 7 的补码 :0000 0111 -6 的补码: 1111 1010 = 1 0000 0001 最后的进位溢出(总共 8 位,这得到 9位,所以第 9 位舍弃),所以舍弃,得到 0000 0001 ,表示 1 |
-7+6 = -1 -7的补码和6的补码相加:11111001 + 00000110 = 11111111 11111111 是 -1 的补码 |
示例:某数字设备用五位二进制表示数,计算
(1)9+3 (2)-9-3 (3)9+12 (4)-9-12
解:(1)[+9]补+[+3]补= 01001+ 00011 = 01100 = +12 正确;
(2)[-9]补+[-3]补= 10111+ 11101 = 110100 = 10100(符号位进位自然丢失), 其真值为-1100 = -12正确;
(3)[+9]补+[12]补= 01001 + 01100 = 10101 其真值为-1011 =-11错误,产生了溢出;
(4)[-9]补+[-12]补 = 10111+10100 = 101011 其真值为01011= +11 错误,产生了溢出。
(1)、(2)两题结果均正确,查其最高位和次高位的进位位,不是均无进位产生,就是均产生进位;(3)、(4)两题结果均错误,查其最高位和次高位的进位位,只有一位产生了进位。此即为判断机器是正常进位还是溢出的基本依据,在微型机中可用异或电路来实现上述的判断。
5、移 码
正数
正数(定点小数、定点整数):
原码,补码,反码相同;
移码只要在原码的最高位+1就可以了
负数
负数(定点小数、定点整数)负数补码求法:也就是 “绝对值的原码取反加1”
反码:保持原码符号位不变,数值位取反
补码:反码的最低位+1 (即 取反加1,符号位也运算)
移码:与补码的符号相反,数值位保持不变
-1 原码:1000 0001
-1 反码:1111 1110 (符号位不变,数值位取反)
-1 补码:1111 1111 (-1的反码加1:1111 1110 +1 = 1111 1111)
标签:0000,补码,000,111,反码,原码 From: https://blog.51cto.com/csnd/5956113