#283. 第六节 原码、反码、补码

第六节 原码、反码、补码

一、机器数和真值

1. 机器数

一个数在计算机中的二进制表示,叫做这个数的机器数。机器数是带符号的,在计算机中,用一个数的最高位存放符号,正数为0,负数为1。

例如十进制中的7,计算机字长为8位(以下均采用字长为8位的),它的机器数就是:

0 0 0 0 0 1 1 1

而-7的机器数为:

1 0 0 0 0 1 1 1

2. 真值

机器数的第一位是符号位,后边才是真正的数值。为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。

例:

0 0 0 0 0 1 1 1 的真值 = +0000111 = 7

1 0 0 0 0 0 1 1 的真值 = -0000011 = -3

二、数的原码、反码、补码

1. 原码

原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。表示形式与机器数相同。

+1 的原码 = 0 0 0 0 0 0 0 1

-1 的原码 = 1 0 0 0 0 0 0 1

由此可知,8位二进制数的取值范围为:

【1 1 1 1 1 1 1 1, 0 1 1 1 1 1 1 1】=【-127,127】

计算机中的运算器只有加法运算器,因此,减法需要转换成加一个负数的形式,例如1-1 = 1+(-1) = 0。 用原码来计算:

结果为 -2

请你思考:为什么会出现这样的结果? 因为引入了符号位。两个正数相加时,符号位都是0,其余各位相加,得出的结果是正确的;一旦有负数参与运算,就会得出错误的结果。 怎么解决这个问题呢?首先考虑:一个负数就是一个正数的相反数,且它们的和为0。 例如:-1 + 1 = 0。 那么,我们尝试用一个正数按位取反来表示一个负数,是否能准确计算正负数相加呢?

2. 反码

正数的反码:其本身。 负数的反码:在原码的基础上,符号位不变,其余各位取反。

例如: +1 = 0 0 0 0 0 0 0 1(原码) = 0 0 0 0 0 0 0 1(反) -1 = 1 0 0 0 0 0 0 1(原码) = 1 1 1 1 1 1 1 0(反)

尝试计算:-1 + 1:

注意,这里是用反码计算,所以结果需要进行“符号位不变,其余各位取反”的操作,即转换成原码为 1000000= -0 = 0。计算结果是正确的。 解决了正数与负数相加的问题,现在尝试计算两个负数相加 -1 - 1:

将结果转换为原码:10000011(原) = -3 ,但-1 -1 = -2,计算结果错误,因此引入了补码,以此解决负数相加的问题。

3. 补码

正数的补码:其本身。 负数的补码:符号位不变,其余各位取反,最后+1(即在反码的基础上+1)。

用补码计算-1 -1 :

将结果转换为原码(先-1,再符号位不变,其余各位取反): 10000010(原码)=-2

补码的表示方式可以计算正数相加、正负数相加、负数相加的所有情况,因此,数值在计算机中以补码的方式存储。

三、数的定点表示和浮点表示

在计算机中小数一般有两种表示方法:一种是小数点固定在某一位置的定点表示法,另一种是小数点的位置可任意移动的浮点表示法。

1. 定点表示法

机器中所有小数点位置是固定不变的,因此小数点不必特别标记。

2. 浮点表示法

用定点表示法时,由于数的表示范围较窄常常不能满足各种数值问题的需要。为了扩大数的范围表示范围,引入浮点表示法。

表示一个浮点数,需要两部分:

  1. 尾数,用以表示数的有效数值;
  2. 阶码,用以表示小数点在该数中的位置。

计算机多数情况下采用浮点表示法,它与科学计数法相似,把一个二进制数通过移动小数点位置表示成阶码和尾数两部分:

四、习题

  1. 十进制数-103的补码是()。

{{ select(1) }}

  • 10011001
  • 11100111
  • 10110011
  • 00011001
  1. 在字长为16位的系统环境下,一个16位带符号整数的二进制补码为:1111111111101101。其对应的十进制整数应该是()。

{{ select(2) }}

  • 19
  • -19
  • 18
  • -18
  1. 把64位非零浮点数强制转换成32位浮点数后,不可能()。

{{ select(3) }}

  • 大于原数
  • 小于原数
  • 等于原数
  • 与原数符号相反
  1. 计算机中的数值信息分为整数和实数(浮点数)。实数之所以能表示很大或者很小的数,是由于使用了()。

{{ select(4) }}

  • 阶码
  • 补码
  • 反码
  • 较长的尾数
  1. 下列各无符号十进制整数中,能用八位二进制表示的数中最大的是()。

{{ select(5) }}

  • 296
  • 133
  • 256
  • 199
  1. 已知x = 0.1011010B,则[x/2][x/2]_补= ()。

{{ select(6) }}

  • 0.1011101
  • 11110110
  • 0.0101101
  • 0.100110
  1. 一个数的补码表示为10001001,下列()是它的原码表示。

{{ select(7) }}

  • 11110111
  • 11110101
  • 11111000
  • 11110110
  1. 2E+03表示()。

{{ select(8) }}

  • 2000
  • 2.03
  • 5
  • 8
  1. 一个浮点数表示为2+62^{+6} * 0.1000101,它的值用十进制表示为()。

{{ select(9) }}

  • 5
  • -2.1
  • 34.5
  • 5
  1. 关于零的原码、补码、反码,下列说法正确的是()。

{{ select(10) }}

  • 零的原码表示只有一种
  • 零的反码表示只有一种
  • 零的补码只有一种
  • 零的原码、反码和补码表示都有两种