考研帮 > 数学 > 每日一练

2.1 制与编码

2.1.2 真值和机器数

  在计算机中,数据可以分为无符号数和有(带)符号数两种,其符号和数字都用二进制码表示,两者一起构成数的机内表示形式,称为机器数,而它真正表示的带有符号的数称为这个机器数的真值。机器数又分为定点数和浮点数。一般而言,机器数有4种表示方法,分别是原码、补码、反码和移码。
  1.无符号数与带符号数
  所谓无符号数,就是整个机器字长的全部二进制位均表示数值位(没有符号位),而带符号数是指数的正负用高位字节的最高位来表示,即定义最高位为符号位,用0表示正数,1表示负数。例如,01001表示无符号数9,表示带符号数+9;11001表示无符号数25,表示带符号数-9(原码)。
  在日常生活中,大量用到的数据其实还是带符号数,即正、负数。为了能正确地区别出真值和各种机器数,本书用X表示真值,[X]表示原码,[X]表示补码,[X]表示反码。
  2.原码
  对于无符号数,原码是一种用数值本身表示的二进制编码。对于有符号数,原码是一种以符号和数值表示的二进制编码。有符号数的原码编码规则是用最高位表示符号,正数用0表示,负数用1表示,其他位表示该数的绝对值。例如,假设用8位表示一个数,则+11的原码是00001011,-11的原码是10001011。因此,正数的原码是它本身,负数的原码是真值取绝对值后,在最高位(左端)补1。
  对于0,原码是有+0和-0之分的,故有两种形式:[+0]=00000000,[-0]=10000000。
  希赛教育研究生院专家提示:直接使用原码进行运算可能会存在问题。例如,(1)10+(–1)10 = 0。如果直接使用原码,则:

(00000001)2+(10000001)2 = (10000010)2

  这样计算的结果是–2,明显不正确。也就是说,使用原码直接参与计算可能会出现错误的结果。所以,原码的符号位不能直接参与计算,必须和其他位分开,但这样会增加硬件的开销和复杂性。
  3.反码
  反码使用得较少,它只是补码的一种过渡。对于无符号数,反码是一种用对数值按位取反表示的二进制编码。对于有符号数,反码是一种用符号位和对数值按位取反表示的二进制编码。有符号数的反码编码规则是用最高位表示符号,正数用0表示,负数用1表示。正数的反码是其原码本身,负数的反码的数值部分是原码的数值部分按位取反,而符号部分不变。例如,+11的反码是00001011,–11的反码为11110100。因此,正数的反码与其原码相同,负数的反码是符号位不变,其余各位按位取反。
  在反码表示中,真值0也有两种不同的表示形式:[+0]=00000000,[-0]=11111111。
  同样,对上面的加法,使用反码的计算结果是:

(00000001)2+ (11111110)2 = (11111111)2

  这样的结果是-0,但由于在反码表示中,0有正负之分,因此使用反码进行计算其结果也不一定正确。
  4.补码
  补码是计算机处理有符号数的运算常用的一种方法。对于无符号数,补码是一种用对数值按位取反并加1表示的二进制编码。对于有符号数,补码是一种用符号和对数值按位取反并加1表示的二进制编码。因此,正数的补码等于正数本身,负数的补码等于模减去它的绝对值,即符号位1不变,数值部分是反码的数值部分加1。例如,+11的补码是00001011,-11的补码11110100+1=11110101。
  在补码表示中,真值0的表示形式是唯一的:[+0]=[-0]=00000000。
  再次做以上的加法,是这样的:

(00000001)2+ (11111111)2 = (00000000)2

  这说明直接使用补码进行计算的结果是正确的。因为补码中0是唯一表示的。由此可见,在计算机中要对有符号数进行运算,最好是将其转换为补码再运算,事实也是如此。
  5.数值表示范围
  对于原码、反码和补码,假设用n位表示数据(二进制),则各种表示方法的表示范围如表2-1所示。

表2-1 各种码制所表示数的范围

  定点整数 定点小数
原码 -(2n-1-1)~2n-1-1 -1<X<1
反码 -(2n-1-1)~2n-1-1 -1<X<1
补码 -2n-1~2n-1-1 -1„X<1

  从表2-1中可以看出,补码负数表示范围较正数表示范围宽,能多表示一个绝对值最大的负数。

关于"最后阶段,真题的正确打开方式_备考经验_考研帮"15名研友在考研帮APP发表了观点

扫我下载考研帮

考研帮地方站更多

你可能会关心:

来考研帮提升效率

× 关闭