原码、反码、补码
由于计算机的硬件决定,任何存储于计算机中的数据,其本质都是以二进制码存储。冯·诺依曼的经典计算机体系结构框架中,一台计算机由运算器、控制器、存储器、输入和输出设备组成。其中运算器只有加法运算器,没有减法运算器。
计算机中的减法是通过加法实现的。现实世界中所有的减法也可以当成加法的,减去一个数可以看作加上这个数的相反数,这就不得不引入一个符号位。符号位在内存中存放的最左边一位,如果该位位 0,则说明该数为正;若为 1,则说明该数为负。
原码¶
原码是最简单的机器数表示法,用最高位表示符号位,其他位存放该数的二进制的绝对值。以带符号位的四位二进制数为例:1010,最高位为 1 表示这是一个负数,其它三位 010,即 \(0*2^{2}+1*2^{1}+0*2^0=2\),所以 1010 表示十进制数 -2。
原码相加:
0001 + 0010 = 0011, 1 + 2 = 3
0000 + 1000 = 1000, +0 + (-0) = -0
0001 + 1001 = 1010, 1 + (-1) = -2 // 有错
原码的特点:
- 原码表示直观、易懂,与真值转换容易。
- 原码中0有两种不同的表示形式,给使用带来了不便。
- 原码表示加减运算复杂。
反码¶
反码:正数的反码还是等于原码;负数的反码就是它的原码除符号位外,按位取反。
反码相加:
反码的特点:
- 在反码表示中,用符号位表示数值的正负,形式与原码表示相同,即 0 为正,1 为负。
- 在反码表示中,数值 0 同样有两种表示方法。
- 反码的表示范围与原码的表示范围相同。
(反码表示在计算机中往往作为数码变换的中间环节)
补码¶
补码:正数的补码等于它的原码;负数的补码等于反码 +1。
其实负数的补码等于反码+1只是补码的求法,而不是补码的定义,很多人以为求补码就要先求反码,其实并不是,那些计算机学家并不会心血来潮的把反码+1就定义为补码,只不过补码正好就等于反码+1而已。 ## 补码的工作原理 补码 - 维基百科,自由的百科全书 (wikipedia.org)
补码的特点:
- 在补码表示中,用符号位表示数值的正负,形式与原码的表示相同,即0为正,1为负。但补码的符号可以看做是数值的一部分参加运算。(正数的补码表示就是其本身,负数的补码表示的实质是把负数映像到正值区域,因此加上一个负数或减去一个正数可以用加上另一个数(负数或减数对应的补码)来代替。 从补码表示的符号看,补码中符号位的值代表了数的正确符号,0表示正数,1表示负数;而从映像值来看,符号位的值是映像值的一个数位,因此在补码运算中,符号位可以与数值位一起参加运算)
- 在补码表示中,数值0只有一种表示方法。
- 负数补码的表示范围比负数原码的表示范围略宽。纯小数的补码可以表示到-1,纯整数的补码可以表示到-2^n。
由于补码表示中的符号位可以与数值位一起参加运算,并且可以将减法转换为加法进行运算,简化了运算过程,因此计算机中均采用补码进行加减运算。