最近在学习计算机组成原理的过程中遇到了这样的问题,关于原码反码补码移码的问题。这四个码在遇到的过程中会很纠结不知道该如何下手,一时间就会很混这里进行一些总结。
注意正数和+0的原码 反码 补码均是一样的没有变化!!!
首先我们将他们分类,分为原码和反码 补码和移码这两种。
原码和反码是相对应的两者之间的关系就是符号位不发生变化而其他位置进行取反的操作。
补码和移码的关系是只将符号位取反其他位置不变即可。
原码和补码的关系就是原码的符号位不发生改变其他位置取反再加一即可
我们发现通过这样的关系我们就可以将这四个码的关系连接起来了。我们很容易的得到原码那么我们在保持符号位不变其余位置取反就可以的到反码。我们也可以保持符号位不变其他位置取反加一得到补码。得到补码之后只需要对符号位取反就可以得到移码了。由于原码和补码的关系就是原码的符号位不发生改变其他位置取反再加一即可和原码和反码是相对应的两者之间的关系就是符号位不发生变化而其他位置进行取反的操作。所以补码也可以看做在反码的基础上加一!(再次注意一下正数和+0的原码 反码 补码是一样的!!!)
接下来我们讨论这几个码的取值范围:
由于原码是和反码相对应的所以他们的取值范围是一样的 为+0~2^n-1和1-2^n~-0;
补码和移码也是相对应的他们的取值范围是一样的为-2^n~2^n-1中间注意只有一个+0是没有-0的和原码反码相比较负数范围多了一个最小的少了一个最大的。
以8位举例子
原码部分: 反码部分:
+0:0000 0000 0000 0000
-0:1000 0000 1111 1111
127:0111 1111 0111 1111
-127:1111 1111 1000 0000
补码部分:
0:0000 0000
-1:1111 1111(注意无论是什么位制-1都是全部位置都是1 推导:原码1000 0001转换即可得到)
-127:1000 0001
127:0111 1111
-128:1000 0000
移码部分:
0:1000 0000
127:1111 1111
-128:0000 0000