补码

补码

1、补码的表示方法是:

  正数的补码就是其本身

  负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

  

2、为何要使用补码.

  补码将减法问题转化为了加法问题。使用同余原理,巧妙地将符计算也藏了进去。

  按位取反的本质:以 Signed Byte 的前7位为例,对x按位取反,得的值为 127-x。例如,1,前7位按位取反,会得到 127-1=126。

  补码为按位取反,且+1。还有 Signed Byte 为例,例如,1,前7位按位取反,会得到 127-1=126,+1后为127。

  所以,Signed Byte下,-1的补码,符号位为1,其余7位为FFF|FFFF。

  那如何由补码求得原值呢,对 FFF|FFFF按位取反,其值为 127-FFF|FFFF=0,再加上1,就等于原值1。

  可以发现,原值=>补码的过程中需要加1,补码=>原值的过程中也需要加1。以变量来推一下。

  原值 x,补码为 127-x+1。

  原值 127-x+1,按位取反为 127-(127-x+1) = (127+127+x-1)%127 = x-1。比原值x少了1。

     所以从补码值域得到原值,需要按位取反再+1。

参考:

1、https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

2、https://www.cnblogs.com/dyllove98/archive/2013/08/04/3236802.html

原文地址:https://www.cnblogs.com/tekkaman/p/10491287.html