原码、补码、反码、移码

1,101 阅读7分钟

计算机中分为无符号数和有符号数,无符号整型和有符号整型的区别就是无符号类型可以存放的正数范围比有符号整型中的范围大一倍,因为有符号类型将最高位存储符号,而无符号类型全都存储数字。
有符号数的最高位为0表示是正数,最高位1表示是负数。
要想了解清楚计算机中无符号数和有符号数的具体运算,则需要清楚什么是原码、反码、补码、移码。

原码

原码就是其他进制的数的二进制码表示,最高位的0和1则表明,该数是正数和负数

整数原码公式定义

整数原码公式定义如下所示:

其中为真值(数对应的二进制表示),n代表整数的位数,这里的位数就是采用多少位来表示整数,比如1字节,那么对应的位数就是8,因为1byte=8bit。
举例说明如下:

可以看出真值的原码表示用逗号将符号位和数值部分隔开,逗号之前的最高位表示正数和负数,并不是表示实际的数。
所以可以快速的出其他真值的源码表示,例如,则对应的,则对应的

小数原码公式定义

小数原码公式定义如下所示:

其中为真值(数对应的二进制表示)
举例说明如下:

  1. 假设,根据公式定义可得出
  2. 假设,根据公式定义可得出

可以看出真值的原码表示用小数点将符号位和数值部分隔开,小数之前的最高位表示正数和负数,并不是表示实际的数。但是中小数点之前的高位代表的意义不一样,中小数之前的值代表真正的数,而中小数之前的值代表符号,表示正负。

计算机中实际上是不会存储小数点和逗号的,原码的表示方式,则是为了让人看起来直观,所以原码的特点就是表示简单、看起来直观。
使用原码作加法的时候,其特征如下:

要求数1数2实际操作结果符号
加法
加法可正可负
加法可正可负
加法

可以看出,根据原码来作加法的时候,实际上作的可能是减法或者加法,对于运算器来说,只作加法会比作减法或者其他运算较方便,所以说应该把加法和减法进行归一化,只作加法操作。实际上的操作就是找到一个与负数等价的正数来代替这个负数。

补码

由于原码加法操作需要归一化,为了找到与负数等价的正数,则需要使用补码。

补的概念

拿12为模的时钟来说,假设逆时针旋转使用负表示,顺时针旋转使用正表示,那么从6点到3点就有两种表示方法。

  1. 可以逆时针旋转到3点,用-3表示,即 6 +(-3)= 3
  2. 可以顺时针旋转到3点,用+9表示,即 6 + (+9)= 15,由于12为模,所以大于12的部分需要清楚,即 6 + (+9) -12 = 3

所以可以得出的结论如下:

  1. 如果一个正数和一个负数互补,那么两个数的绝对值等于模(mod)
  2. 一个负数加上模可以得到该负数的补数
  3. 可以看出 6 + 6 = 12,即正数的补数即为其本身

补码公式定义

计算机中如果寄存器(也可以是其他硬件)使用4位来保存数,那么其模就是,如果要把真值1011经过操作变为0000,那么可以的做法如下:

  1. 1011 - 1011 = 0000
  2. 1011 + 0101 = 10000(由于这里是4位表示,那么多处的高位会忽略掉)-> 0000

可以得出-1011可以用0101代替,即-1011的补数为0101,但是上面说过正数的补数为自己,那么0101的补数为0101,此时0101不能分清到底是负数还是正数的补数。
为了区分0101是正数的补数还是负数的补数,那么可以借鉴原码中的表示方法,增加一个高位,用1或者0代表正数还是负数,即0,0101和1,0101。
可以发现的是,现在多了一位用来表示正负,那么之前的4位位模,即已经满足不了,所以只需要把位加1作为模就可以表示了,即实际的模为

整数补码公式定义

整数补码公式定义表示如下所示:

其中为真值,为表示正数的位数
举例说明如下:

  1. 假设,则
  2. 假设,则

可以看出真值的补码表示用逗号将符号位和数值部分隔开,逗号之前的最高位表示正数和负数,并不是表示实际的数。

小数补码公式定义

小数补码公式定义表示如下所示:

其中为真值,mod设置为2,还可以以4、8等其他数为mod。
举例说明如下:

  1. 假设,则= 0.1110
  2. 假设,则

可以看出真值的补码表示用小数点将符号位和数值部分隔开,小数点之前的最高位表示正数和负数
通过补码的公式定义和上述的例子可以发现,当真值()为时,补码可以用原码除符号位每位取反,末位加1求得,同理,对应的通过方法也可以求出对应的补码的原码,也就是当真值为时,原码可以用补码除符号位每位取反,末位加1求得

反码

整数反码公式定义

整数反码公式定义如下:

其中为真值,为整数的位数。
举例说明如下:

  1. 假设,则
  2. 假设,则

以看出真值的反码表示用逗号将符号位和数值部分隔开,逗号之前的最高位表示正数和负数,并不是表示实际的数。

小数反码公式定义

小数反码公式定义如下:

其中为真值,为小数的位数。
举例说明如下:

  1. 假设,则
  2. 假设,则

以看出真值的反码表示用小数符号将符号位和数值部分隔开,小数符号之前的最高位表示正数和负数,并不是表示实际的数。

通过三种机器数(原码、补码、反码)的公式定义和例子可以看出如下特点:

  1. 最高位为符号位,书写上用“,”(整数)或“.”(小数)将数字部分和符号位隔开
  2. 符号位的0/1表示的是符号,而不是真正的数
  3. 对于正数,原码=补码=反码
  4. 对于负数,符号位为1,其数值部分原码除符号位外每位取反末位加1得到补码,末位不加1得到反码

移码

假设x1=+21,x2=-21,其对应的二进制分别为+10101,-10101,其对应的补码为0,10101,1,010111,通过补码去比较大小,会发现x1小于x2。所以说补码很难直接判断其真值大小,这个时候可以使用移码表示。

移码公式定义

移动公式定义表示如下:

其中为真值,n为整数的位数。
举例说明如下:

  1. 假设,则
  2. 假设,则

以看出真值的移码表示用顿号符号将符号位和数值部分隔开,顿号符号之前的最高位表示正数和负数,并不是表示实际的数。
在移码中符号位为1表示正数,为0表示负数,而且移码通常用来浮点数的阶码部分,而阶码都是整数来表示,所以移码只用于整数表示。

移码和补码的比较

通过补码的例子和移码的例子可以看出,补码与移码只差一个符号位。