在计算机中,数据有四种表现形式,分别是原码,反码,补码,移码
原码
原码由符号位和数值组成,一般最高位为符号位,其余低位表示数值的绝对值
例如:
数值1 | 数值-1 | 1+(-1) |
---|---|---|
0000 0001 | 1000 0001 | 1000 0010 |
这里可以看到,一和负一相加得到的是负二,这里我们可以知道,在计算机中,原码不用来进行计算,我们需要求出补码来进行数值计算,而补码要通过反码进行转换
反码
反码:正数的反码与原码相同,负数的反码除符号位外按位取反
例如:
数值1 | 数值-1 | 1+(-1) | |
---|---|---|---|
原码 | 0000 0001 | 1000 0001 | 1000 0010 |
反码 | 0000 0001 | 1111 1110 | 1111 1111 |
补码
补码:整数的补码与原码相同,负数在末尾加1
例如:
数值1 | 数值-1 | 1+(-1) | |
---|---|---|---|
原码 | 0000 0001 | 1000 0001 | 1000 0010 |
反码 | 0000 0001 | 1111 1110 | 1111 1111 |
补码 | 0000 0001 | 1111 1111 | 0000 0000 |
这里可以看出通过补码的运算,已经得到了1+(-1)的正确结果0
移码
移码:补码的符号位按位取反其余不变
例如:
数值1 | 数值-1 | 1+(-1) | |
---|---|---|---|
原码 | 0000 0001 | 1000 0001 | 1000 0010 |
反码 | 0000 0001 | 1111 1110 | 1111 1111 |
补码 | 0000 0001 | 1111 1111 | 0000 0000 |
移码 | 1000 0001 | 0111 1111 | 1000 0000 |
如果要从补码转换为原码,可以直接进行+1再取反的操作
例子1:补码是1111 1111(假设是8位负数)
符号位为1,负数。
数值位取反:111 1111 → 000 0000。
加1:000 0000 + 1 = 000 0001。-
原码:1000 0001(即-1)。
原码转补码:
原码1000 0001。
反码:1111 1110。
补码:1111 1110 + 1 = 1111 1111。正确。