原码反码补码
- 计算机常见数据的分类
- 机器数机器真值
- 原码
- 反码
- 补码
- 为什么需要反码和补码
- 使用补码计算
- 将补码转换为原码
计算机常见数据的分类
机器数及机器数的真值
机器数就是数字在计算机中的 二进制表示形式
机器数有正负之分, 使用最高位作为符号位,表示正负
使用 ==0== 表示 正 , 使用 ==1== 表示负
+3 = 先确定符号位 0000 0011
+7 = 0000 0111
-9 = 1000 1001
-13 = 1000 1101
机器数的真值就是机器数所对应的十进制的数值
1000 1101 = -13
1000 1111 = -15
原码
==原码就是符号位加上真值的绝对值==
+9 = 符号位0 有效位0001001 = ==0==000 1001 [原码]
-14 = 符号位 1 有效位0001110 = ==1==000 1110 [原码]
14 = 符号位0 有效位000 1110 = ==0==000 1110 [原码]
==相反数之间只有第一位不同,1表示负数,0表示正数==
求-25的原码?
先求25的原码,先后将最高为改为1即可!
-25 = 1001 1001
反码
正数 : 正数的反码和原码相同的
+15 = 0000 1111 [原码] = 0000 1111 [反码]
负数: 在原码的基础上 , 符号位不变,其余各位,逐位取反 , 0 - > 1 , 1->0
原码 | ==1== | 0 | 0 | 1 | 1 | 0 | 0 | 1 | -25 = [25 = 16+ 8 + 1 ] |
---|---|---|---|---|---|---|---|---|---|
反码 | ==1== | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 符号位不变,其余各位逐位取反 |
-25 = 1110 0110 [反]
-36 =
-45 =
-55 =
原码 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | -36 = 36 = 32 + 4 |
---|---|---|---|---|---|---|---|---|---|
反码 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | |
原码 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | -45 = 45 = 32 + 8+ 4 + 1 |
反码 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | |
原码 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | -55 = 55 = 32 + 16 + 4 +2 + 1 |
反码 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
补码
正数 : 正数的补码 原码 反码 全部相同
+7 = 0000 0111 [原] = 0000 0111 [反] = 0000 0111 [补]
负数 : 在反码的基础上 , 最低位 + 1
原码 | ==1== | 0 | 1 | 0 | 0 | 0 | 0 | 1 | -33 = 33 = 32 + 1 |
---|---|---|---|---|---|---|---|---|---|
反码 | ==1== | 1 | 0 | 1 | 1 | 1 | 1 | 0 | |
加1 | ==0== | 0 | 0 | 0 | 0 | 0 | 0 | 1 | |
补码 | ==1== | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
-46
-66
-37
原码 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | -46 = 46 = 32 + 8 + 4 + 2 |
---|---|---|---|---|---|---|---|---|---|
反码 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | |
加1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | |
补码 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | |
原码 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | -66 = 66 = 64 + 2 |
反码 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | |
加1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | |
补码 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | |
原码 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | -37 = 37 = 32 + 4 + 1 |
反码 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | |
加1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | |
补码 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
为什么需要反码和补码
高位溢出
使用补码计算
53 + 35 =
53 - 18 =
-46 -35 =
35的补码 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 35 - 17 = 18 |
---|---|---|---|---|---|---|---|---|---|
原码 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | -17 = 17 = 16 1 |
反码 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | |
加1 | 1 | ||||||||
-17的补码 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | |
35的补码 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | |
0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 18 |
53 + 35 = 88 | |||||||||
---|---|---|---|---|---|---|---|---|---|
53的补码 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 53 = 32 + 16 + 4 + 1 |
35的补码 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 35 = 32 + 2 + 1 |
0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 64 + 16 + 8 = 88 | |
53 - 18 = 35 | |||||||||
53的补码 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | |
-18原码 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | -18 = 18 = 16 + 2 |
-18的反码 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | |
加1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | |
-18的补码 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | |
53的补码 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | |
0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 32 + 2 + 1 = 35 | |
-46 -35 = | |||||||||
-46的原码 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | -46 = 46 = 32 + 8 + 4 + 2 |
-46的反码 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | |
加1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | |
-46的补码 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | |
-35的原码 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | |
-35的反码 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | |
加1 | 1 | ||||||||
-35的补码 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | |
-46的补码 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | |
-81的补码 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | ==负数的补码,不能直接读出== |
将补码转回原码
==负数的补码,不能直接读出==
==方法:求补码的补码==
把负数的补码,当成原码,再求补码
-81的补码/原码 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 负数的补码,不能直接读出 |
---|---|---|---|---|---|---|---|---|---|
-81的反码 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | |
加1 | 1 | ||||||||
1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | - [64 + 16 + 1 ] = -81 |
==符号位不变,其余各位取反,然后加1==
-35的补码 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 1 |
---|---|---|---|---|---|---|---|---|
-46的补码 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |