计组总结2-原码、补码和反码

机器数

计算机中表示的带符号的二进制数成为“机器数”,机器数有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

猜你喜欢

转载自blog.csdn.net/lyn_00/article/details/79722103