原码 反码 补码 移码的转换
这三种机器码都是二进制数据的表现形式,可以表现正数和负数。
原码是可以直接表现出数据的正负和大小。
正数的原码、反码和补码都是相同的。
反码用于原码和补码的转换的功能。
而补码可以在计算机硬件内更好地实现一些带负号的运算。
使用补码可以使用8位二进制表示-27 ~27-1 的整数范围。
移码可以表现出数值的大小。
简记:符号不变,数值取反 ,末位加一,符号取反。
一、原码
原码由符号位和数值位表示。符号位为最左边的位,为0表示正数,为1表示负数。
最左边是符号位为0,剩余7位是数值位。
十进制整数14使用原码表示为:
# 最左边是符号位为0,剩余7位是数值位。
0000 1110
十进制整数-14使用原码表示:
# 最左边是符号位为1,剩余7位是数值位。
1000 1110
二、原码转反码
反码也是由符号位和数值位表示。符号位为最左边的位,为0表示正数,为1表示负数。
由于正数的原码与反码相同,这里仅讨论负数的转化。
符号位不变,数值位取反。
十进制整数-14使用原码表示:
# 最左边是符号位为1,剩余7位是数值位。
1000 1110
十进制整数-14使用反码表示:
# 最左边是符号位为1,剩余7位是数值位相较于原码取反。
1111 0001
三、原码转反码转补码
补码也是由符号位和数值位表示。符号位为最左边的位,为0表示正数,为1表示负数。
由于正数的原码与补码相同,这里仅讨论负数的转化。
符号不变,数值取反 ,末位加一。
十进制整数-14使用原码表示:
# 最左边是符号位为1,剩余7位是数值位。
1000 1110
十进制整数-14使用反码表示:
# 最左边是符号位为1,剩余7位是数值位相较于原码取反。
1111 0001
十进制整数-14使用补码表示:
# 最左边是符号位为1,剩余7位是数值位相较于补码加一。
1111 0010
四、原码转反码转补码转移码
移码可以直观的反应出其大小。
正数只需要进行末位加一操作。
负数需要进行四次操作:
符号不变,数值取反 ,末位加一,符号取反。
十进制整数-14使用原码表示:
# 最左边是符号位不变,剩余7位是数值位。
1000 1110
十进制整数-14使用反码表示:
# 最左边是符号位不变,剩余7位是数值位相较于原码取反。
1111 0001
十进制整数-14使用补码表示:
# 最左边是符号位不变,剩余7位是数值位相较于反码加一。
1111 0010
十进制整数-14使用移码表示:
# 最左边是符号位相较于补码取反,剩余7位是数值位不变。
0111 0010
各种码表示的数值大小
这里由于0有两种表现形式,因此将-0表示为-128,这样数据范围就为-128~127。
十进制(原码) | 原码 | 反码 | 补码 | 移码 |
---|---|---|---|---|
-0(-128) | 1000 0000 | 1111 1111 | 1000 0000 | 0000 0000 |
-2^7-1 | 1111 1111 | 1000 0000 | 1000 0001 | 0000 0001 |
-2^7-2 | 1111 1110 | 1000 0001 | 1000 0010 | 0000 0002 |
-2 | 1000 0010 | 1111 1101 | 1111 1110 | 0111 1110 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 | 0111 1111 |
+0 | 0000 0000 | 0000 0000 | 0000 0000 | 1000 0000 |
1 | 0000 0001 | 0000 0001 | 0000 0001 | 1000 0001 |
2 | 0000 0010 | 0000 0010 | 0000 0010 | 1000 0010 |
2^7-2 | 0111 1110 | 0111 1110 | 0111 1110 | 1111 1110 |
2^7-1 | 0111 1111 | 0111 1111 | 0111 1111 | 1111 1111 |