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 | -1X<1 |
从表2-1中可以看出,补码负数表示范围较正数表示范围宽,能多表示一个绝对值最大的负数。
关于"最后阶段,真题的正确打开方式_备考经验_考研帮"有15名研友在考研帮APP发表了观点
扫我下载考研帮
最新资料下载
2021考研热门话题进入论坛
考研帮地方站更多
你可能会关心:
来考研帮提升效率