
负数的补码怎么变回原码?
只需对其各位取反加一即可得到原码。
从数学角度回答,假定在32位机器上。
设某负数X,则X+X(反)= 0xFFFFFFFF。
所以X+X(反)+1 = 0,可以得出 0 - X = X(反)+ 1。
这里 0 - X即定义为负数X的补码,这样,计算机在进行X-Y运算时实际可用X+Y(补)代替,硬件角度只需实现加法电路即可。
同样的道理,0-X(补)=X(补)(反)+1 = X,即已知负数补码只需对其各位取反加一即可得到原码。
补码的意义
补码“模”概念的引入、负数补码的实质、以及补码和真值之间的关系所揭示的补码符号位所具有的数学特征,无不体现了补码在计算机中表示数值型数据的优势,和原码、反码等相比可表现在如下方面:
1、解决了符号的表示的问题。
2、可以将减法运算转化为补码的加法运算来实现,克服了原码加减法运算繁杂的弊端,可有效简化运算器的设计。
3、在计算机中,利用电子器件的特点实现补码和真值、原码之间的相互转换,非常容易。
4、补码表示统一了符号位和数值位,使得符号位可以和数值位一起直接参与运算,这也为后面设计乘法器除法器等运算器件提供了极大的方便。
总之,补码概念的引入和当时运算器设计的背景不无关系,从设计者角度,既要考虑表示的数的类型(小数、整数、实数和复数)、数值范围和精确度,又要考虑数据存储和处理所需要的硬件代价。因此,使用补码来表示机器数并得到广泛的应用,也就不难理解了。
-5的原码是: 1000 0101
-5的反码是: 1111 1010
-5的补码是: 1111 1011 //因为这里加1,所以是这个结果
很明显逆回去就是: 1111 1011 要先减1,结果为: 1111 1010 这就得到反码了
接下来再反回去不就是原码了吗? 即 1111 1010 符号不变,数值位按位取反,得到:
1000 0101 刚好就是-5的原码
这个,不好说。
补码、原码,并非是一一对应的。
比如,-128 具有补码 1000 0000。
但是,-128 并没有八位的原码。
这就,没法求了,谁也求不出来。
正数的原码=反码=补码,这样的变换,其实,就是不变的。
负数的各个码,是各不相同的,这才需要变换。
--------------------
由原码求补码的方法是:原码取反加一。
那么,由补码求原码,就应该是:补码减一取反。
但是,对于二进制数来说,取反加一、减一取反,效果是相同的。
可以统一使用“取反加一”的方法来变换。
证明如下:
假设是四位代码是:xxxx。 对 x 取反的算法就是:1-x。
那么:
● 先取反后加一,就是:1111-xxxx + 0001。
● 先减一后取反,则是:1111-(xxxx-0001)。
由小学的知识可知,这两个式子,是等效的。
所以,取反加一和减一取反,效果是相同的。证毕。
--------------------
另外说一下:用取反加一来做原码补码的互相转换,是有缺陷的。
因为,原码比补码,少表示一个数。
所以,无论是由原码求补码、或是由补码求原码,都有一个坑,等着你往里跳。
--------------------
其实,把补码变回原码,并没有什么意义,因为,计算机根本就不使用原码。
实际上,都是把补码,直接变换成真值。