原码、反码、补码的转换关系

     计算机中参与运算的数分为无符号数有符号数两类,且均存放于寄存器中。故寄存器的位数又叫做机器字长。当机器字长相同时,这两类数对应数值范围有所区别。

比如当机器字长为32位时

    无符号数的表示范围             0 ~ 4294967295

    有符号数的表示范围   -2147483648 ~ 2147483647

 

        机器数数在计算机中的二进制表示形式。机器数是有符号数。原码、反码、补码是机器数中常见的几种。

 

原码:最简单的一种表示形式,符号位(最高位)存放符号, 正数为0, 负数为1。数值位为真值的绝对值。需注意,原码中 0 有两种表示形式。优点表示简单,易于和真值转换。缺点对于计算机而言运算复杂。

反码:一般用于原码和补码的转换过渡。真值为正的反码与原码相同,真值为负的反码是在其原码的基础上, 符号位不变,数值位取反。

补码真值为正的补码与原码相同,真值为负的补码是在其原码的基础上, 符号位不变,数值位取反, 然后加1。 (等价于在反码的基础上加1)。

    首先,根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1+(-1), 所以计算机被设计成只有加法而没有减法, 而让计算机辨别”符号位”会让计算机的基础电路设计变得十分复杂,于是就让符号位也参与运算,从而产生了反码。 
   用反码计算, 出现了”0”这个特殊的数值, 0带符号是没有任何意义的。 而且会有[0000 0000]和[1000 0000]两个编码表示0。于是设计了补码, 负数的补码就是反码+1,正数的补码就是正数本身,从而解决了0的符号以及两个编码的问题: 用[0000 0000]表示0,用[1000 0000]表示-128。 
   注意-128实际上是使用以前的-0的补码来表示的, 所以-128并没有原码和反码。
使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数。 这就是为什么8位二进制, 使用补码表示的范围为[-128, 127]。

参考资料

[1]唐朔飞.计算机组成原理[M].高等教育出版社,2008.

[2]Jason_M_Ho. 原码,反码,补码[EB/OL]. https://blog.csdn.net/Jason_M_Ho/article/details/78700434

 @兰天米文CSDN
 

 

 

 

 

你可能感兴趣的:(原码、反码、补码的转换关系)