跳转至

原码、反码、补码

由于计算机的硬件决定,任何存储于计算机中的数据,其本质都是以二进制码存储。冯·诺依曼的经典计算机体系结构框架中,一台计算机由运算器、控制器、存储器、输入和输出设备组成。其中运算器只有加法运算器,没有减法运算器。

计算机中的减法是通过加法实现的。现实世界中所有的减法也可以当成加法的,减去一个数可以看作加上这个数的相反数,这就不得不引入一个符号位。符号位在内存中存放的最左边一位,如果该位位 0,则说明该数为正;若为 1,则说明该数为负。

原码

原码是最简单的机器数表示法,用最高位表示符号位,其他位存放该数的二进制的绝对值。以带符号位的四位二进制数为例:1010,最高位为 1 表示这是一个负数,其它三位 010,即 \(0*2^{2}+1*2^{1}+0*2^0=2\),所以 1010 表示十进制数 -2。

Pasted image 20221028150900.png

原码相加:

0001 + 0010 = 0011,   1 +   2  =  3  
0000 + 1000 = 1000,  +0 + (-0) = -0  
0001 + 1001 = 1010,   1 + (-1) = -2 // 有错

原码的特点:

  1. 原码表示直观、易懂,与真值转换容易。
  2. 原码中0有两种不同的表示形式,给使用带来了不便。
  3. 原码表示加减运算复杂。

反码

反码:正数的反码还是等于原码;负数的反码就是它的原码除符号位外,按位取反。

Pasted image 20221028150836.png

反码相加:

0001 + 1110 = 1111     1  + (-1) = -0  
1110 + 1100 = 1010   (-1) + (-3) = -5

反码的特点:

  1. 在反码表示中,用符号位表示数值的正负,形式与原码表示相同,即 0 为正,1 为负。
  2. 在反码表示中,数值 0 同样有两种表示方法。
  3. 反码的表示范围与原码的表示范围相同。

(反码表示在计算机中往往作为数码变换的中间环节)

补码

补码:正数的补码等于它的原码;负数的补码等于反码 +1。

其实负数的补码等于反码+1只是补码的求法,而不是补码的定义,很多人以为求补码就要先求反码,其实并不是,那些计算机学家并不会心血来潮的把反码+1就定义为补码,只不过补码正好就等于反码+1而已。 ## 补码的工作原理 补码 - 维基百科,自由的百科全书 (wikipedia.org)

Pasted image 20221028151834.png

补码的特点:

  1. 在补码表示中,用符号位表示数值的正负,形式与原码的表示相同,即0为正,1为负。但补码的符号可以看做是数值的一部分参加运算。(正数的补码表示就是其本身,负数的补码表示的实质是把负数映像到正值区域,因此加上一个负数或减去一个正数可以用加上另一个数(负数或减数对应的补码)来代替。 从补码表示的符号看,补码中符号位的值代表了数的正确符号,0表示正数,1表示负数;而从映像值来看,符号位的值是映像值的一个数位,因此在补码运算中,符号位可以与数值位一起参加运算)
  2. 在补码表示中,数值0只有一种表示方法。
  3. 负数补码的表示范围比负数原码的表示范围略宽。纯小数的补码可以表示到-1,纯整数的补码可以表示到-2^n。

由于补码表示中的符号位可以与数值位一起参加运算,并且可以将减法转换为加法进行运算,简化了运算过程,因此计算机中均采用补码进行加减运算。