原码 反码 补码 移码是软考必考的项目,所以需要对其概念、计算方式和取值范围进行总结。
零、使用场景
原码 反码 补码 移码都是计算机中表示数据的方式,各有所长,对于我们来说,都需要加以学习。
软考中最常见的就是一个字节的码位,即 8 个 0/1 字符
,接下来分别加以介绍。
一、原码
原码的第一位是符号位,正数为 0,负数为 1;后面七位是数值位,是二进制。
比如数值 +0
,用原码表示就是 00000000
。
比如数值 +6
,用原码表示就是 00000110
。
比如数值 -7
,用原码表示就是 10000111
。
原码的求解很简单,只要把十进制的数字转为二进制,改一下最前面的符号位即可。
但原码在做加减运算的时候,会有关于 0
这个数值的 BUG
。
比如计算 +7 + (-7)
,如下所示。
00000111 +10000111 --------- 10001110
计算得到的 10001110
(-14)不是正确的结果,所以就需要其他的码值去做计算。
二、反码
学习了原码之后,反码的求解就简单多了。
正数的反码就等于原码;负数的反码就是在原码的基础上,对非符号位取反即可。
比如 +18
的原码是:00010010
。
那么 +18
的反码就是: 00010010
。
比如 - 17
的原码是: 10010001
。
那么 - 17
的反码就是: 11101110
。
同样我们对 +17 + (-17)
进行加法运算。
00010001 +11101110 --------- 11111111
显然也是不对的,所以我们接下来要看补码。
三、补码
正数的补码就等于原码,负数的补码是在反码的基础上加上 1。
比如 +18
的原码是:00010010
,+18 的反码是: 00010010
,+18 的补码也是 00010010
。
比如 -18
的原码是: 10010010
,-18 的反码是: 11101101
,-18 的补码是 11101110
。
同样我们对 +18 + (-18)
进行加法运算。
00010010 +11101110 --------- 00000000
用补码可以进行正常的加法运算,结果是正确的。
四、移码
移码不管是正负数,在补码的基础上,对符号位取反即可。
比如 +18
的原码是:00010010
,+18 的反码是: 00010010
,+18 的补码是 00010010
,+18 的补码是 10010010
。
比如 -18
的原码是: 10010010
,-18 的反码是: 11101101
,-18 的补码是 11101110
,-18 的补码是 01101110
。
那么问题来了,移码有什么用呢?
据说是为了提现正数比负数大的效果。
五、总结
码制 | 求解方法 | 取值范围 |
原码 | 首位符号位,正数 0 负数 1,后面七位是二进制数值 | - 127 <= N <= 127 |
反码 | 正数同原码,负数符号位不变,其余位取反 | - 127 <= N <= 127 |
补码 | 正数同原码,负数在反码基础上加 1 | - 128 <= N <= 127 |
移码 | 无论正负数,在补码基础上对符号位取反 | - 128 <= N <= 127 |