#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. 浮点表示法
用定点表示法时,由于数的表示范围较窄常常不能满足各种数值问题的需要。为了扩大数的范围表示范围,引入浮点表示法。
表示一个浮点数,需要两部分:
- 尾数,用以表示数的有效数值;
- 阶码,用以表示小数点在该数中的位置。
计算机多数情况下采用浮点表示法,它与科学计数法相似,把一个二进制数通过移动小数点位置表示成阶码和尾数两部分:

四、习题
- 十进制数-103的补码是()。
{{ select(1) }}
- 10011001
- 11100111
- 10110011
- 00011001
- 在字长为16位的系统环境下,一个16位带符号整数的二进制补码为:1111111111101101。其对应的十进制整数应该是()。
{{ select(2) }}
- 19
- -19
- 18
- -18
- 把64位非零浮点数强制转换成32位浮点数后,不可能()。
{{ select(3) }}
- 大于原数
- 小于原数
- 等于原数
- 与原数符号相反
- 计算机中的数值信息分为整数和实数(浮点数)。实数之所以能表示很大或者很小的数,是由于使用了()。
{{ select(4) }}
- 阶码
- 补码
- 反码
- 较长的尾数
- 下列各无符号十进制整数中,能用八位二进制表示的数中最大的是()。
{{ select(5) }}
- 296
- 133
- 256
- 199
- 已知x = 0.1011010B,则= ()。
{{ select(6) }}
- 0.1011101
- 11110110
- 0.0101101
- 0.100110
- 一个数的补码表示为10001001,下列()是它的原码表示。
{{ select(7) }}
- 11110111
- 11110101
- 11111000
- 11110110
- 2E+03表示()。
{{ select(8) }}
- 2000
- 2.03
- 5
- 8
- 一个浮点数表示为 * 0.1000101,它的值用十进制表示为()。
{{ select(9) }}
- 5
- -2.1
- 34.5
- 5
- 关于零的原码、补码、反码,下列说法正确的是()。
{{ select(10) }}
- 零的原码表示只有一种
- 零的反码表示只有一种
- 零的补码只有一种
- 零的原码、反码和补码表示都有两种