NOIP初赛篇——09原码、反码和补码
一、数的原码、补码和反码表示
机器数和真值
在计算机中,表示数值的数字符号只有0和1两个数码,我们规定最高位为符号位,并用0表示正符号,用1表示负符号。这样,机器中的数值和符号全“数码化”了。为简化机器中数据的运算操作,人们采用了源码、补码、反码及移码等几种方法对数值位和符号位统一进行编码。为区别起见,我们将数在计算机中的这些编码表示为机器数(如10000001),而将原来一般书写表示的数称为机器数的真值(如-0000001)。
原码表示法
原码表示法是一种简单的机器数表示法,即符号和数值表示法。设x为真值,则[x]原码为机器数表示。
例:设x=1100110,则[x]原=01100110。
x=-1100111,则[x]原=11100111。
反码表示法
正数的反码就是真值本身;负数的反码,只需对符号位以外的各位进行“求反”(0变1,1变0)即可。
例:设x=1100110,则[x]反=01100110;
x=-1100111,则[x]反=10011000。
补码表示法
负数用补码表示时,可以把减法转化成假发。整数的补码就是真值本身;负数的补码是符号位为1,数值各位取反(0变为1,1变为0),最低位加1。
例:设x=1100110,则[x]补=01100110;
x=-100111,则[x]补=10011001
从上面关于原码、反码、补码的定义可知:一个正数的原码、反码、补码的表现形式相同,符号位为0,数值位是真值本身;一个负数的原码、反码、补码的符号位都为1,数值位原码是真值本身,反码是各位取反,补码是各位取反,最低位加1.真值0的原码和反码表示不唯一,而补码表示是唯一的,即:
[+0]原=000...0,[-0]原=100...0;
[+0]反=000...0,[-0]反=111···1;
[+0]补=[-0]补=000···0。
注:不同编码表示的整数的范围是这样的(以N位二进制位):
原码:0 ~ 2^n -1 (无符号位),-2^(n-1)-1 ~ 2^(n-1)-1有符号位
反码:-2^(n-1)-1 ~ 2^(n-1)-1不存在无符号情况
补码:-2^(n-1) ~ 2^(n-1)-1不存在无符号情况
原码的特点是容易与真值转换,但做加减运算不太方便。反码弥补了原码加减运算的不足。例如:若X1=97,X2=-97,则X1+X2=0。利用二进制原码运算为:若[X1]原=01100001,[X2]原=11100001,则[X1]原+[X2]原为:
将结果转换为十进制数就为66,结果显然错误。
若利用反码进行计算,则[X1]反=01100001,[X2]反=10011110,则[X1]反+[X2]反为:
再将此反码转换为原码,其结果为10000000,即-0.
虽然反码解决了加减运算的问题,但是并没有解决0的两种表示的问题。
补码不仅解决了加减运算的问题,而且0的表示也是唯一的。接着上述的例子,如果利用补码进行运算,[X1]补=01100001,[X2]补=10011111,则[X1]补+[X2]补为:
该结果为0,并且没有+0和-0之分。
补码比原码、反码所能表示的范围略宽,1字节(8位)的有符号整数能表示的范围为-128 ~ 127,而原码和反码都只能表示-127 ~ 127,所以补码目前被广泛应用于计算机的数值表示中。
数的定点表示和浮点表示
在计算机中,小数点一般有两种表示方式:一种是小数点固定在某一位置的定点表示法;另一种是小数点的位置可任意移动的浮点表示法。相应于这两种表示的计算机分别称为定点计算机和浮点计算机。
定点表示法
机器中所有数的小数点位置是固定不变的,因而小数点就不必使用记号表示出来。实际上,小数点课固定在任意一个位置上。
浮点表示法
在数的定点表示法中,由于数的表示范围较窄,常常不能满足各种数值问题的需要。为了扩大数的表示范围,方便用户使用,有些计算机采用浮点表示法。表示一个浮点数,要用两部分:尾数和阶码。尾数用以表示数的有效数值;阶码用以表示小数点在该数中的位置。
计算机多数情况下采用浮点数表示数值,它与科学计数法相似,把一个二进制数通过移动小数点位置表示称为阶码和尾数两部分:
其中:E为N的阶码(Expeont),是有符号的整数;S为N的尾数(Mantissa),是数值的有效数字部分,一般规定取二进制定点纯小数形式。
例:1011101
,
101.1101
,
0.01011101
。