负数的补码怎么变回原码?
只需对其各位取反加一即可得到原码。
从数学角度回答,假定在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 并没有八位的原码。
这就,没法求了,谁也求不出来。
其实,把补码变回原码,并没有什么意义。
实际上,都是把补码变回真值。