移码和补码

计算机中的“数”,花样很多,又是ASCII码、又是BCD码等等,下面,做而论道写了一些关于移码、补码的一些看法,欢迎拍砖。

机器数

计算机中的“数”,其实都不是数字,它们都是一些高、低电平。
其中,高电平为3.2~5.0V,记为1,低电平为0~0.3V,记为0。
这些1、0,显然都不应该称为“数”,应该称为“数码”,称为“机器数”更合适一些。

用8位“数码”,可以形成0000 0000 ~ 1111 1111 共 256 种不同的组合,用16进制表示就更简练一些,把它们像数字一样写在一个数轴上,如下图所示:

 移码和补码_第1张图片


无符号数

用这些“机器数”代表人们常用的“数字”,还是很容易理解的,特别是无符号数 0 ~ 255,不用经过任何变换,直接对应就可以了,如下图所示:

 移码和补码_第2张图片


有符号数

但是,用“机器数”代表“有符号数”,就要费些心思了,这也是被人弄的很滥的部分。

8位二进制数共有 256 种组合,可以用 128 个代表负数,用128 个代表零和正数,那么“有符号数”的范围就是:-128 ~ -1 、0 ~ +127,画在数轴上如下所示:

移码和补码 - 非著名博主 - 电子信息角落 

 

移码

最简单的代表方式是“移码”。

“移码”就是把所有的数字都加上 128,也就是把 -128 ~ +127 的范围的数字,都平移到 0 ~ 255 范围内,然后再用 0 ~ 255 的“机器数”来表示。

当有符号数和机器数的对应关系如下图时,这就是“移码”:
移码和补码_第3张图片 

 

显而易见,机器数0 ~ 127 代表负数 -128 ~ -1,机器数128 ~ 255 代表 0 ~ 127。所有的数字都右移了128,大概这就是“移码”名称的来源吧。

已知一个数 X,其 8 位字长的移码定义为:

    [X]移 = 128 + X                -128  <=  X  <=  127

有兴趣的读者可以去查看计算机类的书籍,从中可以找到这个式子。

移码,应用的场合还是很多的。多数AD转换器产生的数字,就是用移码表示采样数据的。另外在浮点数中,也有应用。

 

补码

移码虽然解决了表示负数的难题,但是它是把全部数字都向右边移动了 128,正数也都变大了,这就不方便进行数字的计算。
为此,有人提出了“补码”的表示方式,即零和正数不用移动,只是把负数向右移动 256 个位置。

关于补码的由来,可见:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/d92cc986c2a1523bc75cc380.html

下图就是补码中负数和机器数的对应关系:
 移码和补码_第4张图片


下图又加上了正数和机器数的对应关系:
 移码和补码_第5张图片

 

可见,机器数0 ~ 127 代表零和正数0 ~ 127,机器数128 ~ 255 代表负数 -128 ~ -1。

已知一个数 X,其 8 位字长的补码定义为:

      /  X                                   0  <=  X  <=  +127 ;0和正数不用变化
  [X]补 = |
      \ 2 ^ 8 -| X |   =   256  +  X        -128 <= X < 0 ;负数就加256

有兴趣的读者可以去查看计算机类的书籍,从中也可以找到这个式子。

从定义式求一个数的补码是非常容易的:是正数就直接变成二进制,是负数先加上256(就变成128~255了)再变成二进制就完了。

补码和移码的互换

从前面的示意图中可以看出,在移码、补码中,仅仅是正数、负数交换了位置,而正数、负数中数字的次序并没有变。

因为机器数0 ~ 127 的最高位都是0,机器数128 ~ 255 的最高位都是1,只要把这最高位变化一下,补码就可以变成移码,同样,移码也可以由此变成补码。

你可能感兴趣的:(原码,反码和补码)