机器数
计算机中表示的带符号的二进制数成为“机器数”,机器数有3种表示方法:原码,补码和反码。
在刚刚接触这三种表示方法时我们可能只是简单的记所谓的口诀(比如说,原码转反码:符号位不变,其他位取反),但是并不知道其中的原理。下面总结以下原码、补码和反码的相关知识
原码表示法
机器数的最高位为符号位,0表示正数,1表示负数。
原码是最接近真值的一种表示形式,这使得原码的计算和我们熟知的十进制运算非常相似,只要运算的结果不产生溢出,原码与原码的运算仍为原码。
但是由于运算需要考虑符号位,符号位和数值位需要分开运算,在机器中进行运算比较复杂,他的便于理解性也成为其最大的缺点。
原码定义:
- 整数部分
- 小数部分
即:[X]原 = 符号位 + |X|
例:
X = +111.1011 —–> [X]原 = 0,111.1011 (符号位与数值位之间用,隔开)
X = - 101.0101 —–> [X]原 = 1,101.0101
原码0的表示
[X]原 = 0,000.0000 = + 0
[X]原 = 1,000.0000 = - 0
原码0的表示方法有两种
补码表示法
上面提到原码运算在机器中实现起来比较复杂,然而利用补码运算则可避免其缺点。
机器数的最高位为符号位,0表示正数,1表示负数。
补码定义:
- 整数部分
- 小数部分
即:[X]补 =( 2 * 符号位 + X ) mod 2^n
自认为最简单的理解是,与原码表示方法不同,补码符号位所表示的位带权值,如果符号位为1,则带负权。
例如:[X]补 = 1111 = -2^3 + 2^2 + 2^1 + 2^0 = -1
补码0的表示
[X]补 = 0,000.000 = + 0 = - 0
补码0的表示方法只有一种
补码的运算
当补码加法运算(减法运算实为加法运算+[-Y]补)的结果不超出机器范围时,可以得出以下重要结论
- 用补码表示的两数进行加法运算,其结果仍为补码
- [X+Y]补 = [X]补 + [Y]补
- 符号位与数值位一样参与运算
反码表示法
机器数的最高位为符号位,0表示正数,1表示负数。
反码定义
- 整数部分
- 小数部分
即:[X]反 = (2^n - 1)* 符号位 + X mod (2^n -1)
反码0的表示
[X]反 = 0,000.0000 = + 0
[X]反 = 1,111.1111 = - 0
反码的运算
补码运算在最高位有进位时,要在最低位+1,要多进行一次加法运算,既增加了复杂性,又影响了速度,故很少在计算机中使用。
总结
理解二进制的表示方法至关重要。
在知晓了原码、补码和反码的定义之后,我们可以来验证之前口诀的正确性,并进行推导。
原码—–>反码 : 符号位不变,数值位取反
原码—–>补码 : 符号位不变,数值位取反加1