原码,反码,补码是设计用来对带符号整数进行编码
1.当前计算机的硬件设计通常采用补码来进行设计:其根本目的简化硬件的复杂程度
下面对原码反码补码简单进行介绍
原码:最早的带符号整数表示方法是用二进制最高位表示符号位,0表示正数,1表示负数。这种表示方法称为原码。例如,+5的原码是00000101,-5的原码是10000101。
反码:为了使减法运算变得更加简单,人们设计出了一种表示负数的方法,即反码。反码的表示方法是对正数的二进制数按位取反得到负数的二进制数,而符号位不取反。例如,+5的反码是00000101,-5的反码是11111010。
补码的表示方法是按位取反加1,得到补码。例如,+5的补码是00000101,-5的补码是11111011。
2.下面给出我对原码的逻辑思考
由于在原码加减的过程中,首先需要对符号高位进行判断,同正或同负则保持符号位不变,数值位相加,一正一负则要根据数值位的大小来判断符号位的值,这种设计使得硬件设计变得较为复杂,
为了解决符号位判断问题,于是人们进一步改进发明了反码
2.下面给出我对反码的逻辑思考
下面提出一个问题:
-
为什么反码要进行按位取反呢?
逻辑其实是一个循环问题,类似时钟,2点要变成1点有什么办法,第一种-1,第二种+11,而11+1为12一个循环
但反码同样存在着问题由于存在着+0和-0,使得同时存在两个反码表示0,以及
这使得在进行加减操作时我们需要对结果进行修正
例如3+(-2)00000011 + 11111101 =00000000结果为0是不对的需要进行修正
其原因个人认为如下以为本质上来说1和-1要关于11111111对称的
但11111111+1其实是00000000
这就导致了不对称性,需要对结果进行修修正,这就导致了计算机硬件上设计的难度大大增加,于是原码诞生
-2 -1 0 1 2
11111101 11111110 11111111(00000000) 00000001 00000011
3.下面给出我对补码的逻辑思考
反码存在的主要问题就在于存在着两个0,+0(00000000)和-0(111111111)
那么如何解决个问题呢,观察+0和-0就会发现-0+1就会忽略溢出位就会循环回到000000000,如果把码值设计成负数位按位取反加1就是实现正零和负零的统一,而正数和其相反数又是关于0000000对称的,这就完美解决了上述问题
-
下面在提出一个问题:为什么符号位能够参与运算呢
当正数加上负数时有以下两种情况:
符号位相加为1(一定一个是0一个是1)
当正数的绝对值大于负数的绝对值的时候,相加由于对称性可知一定产生溢出,此时符号为0,需要和正数的符号位相同,所以正数的符号位设计成0,负数的符号位1
当正数的绝对值小于负数的绝对值的时候,一定不产生溢出,结果同理
此时由于符号位能够参与运算,又不需要对结果进行修改,这样就能够通过符号位参与运算来实现加减法的统一。
补码的加减法运算与无符号数的加减法运算可以使用同一套电路进行实现。这样可以大大简化计算机的硬件设计,降低生产成本,提高计算机的运行速度。