无符号数和带符号数
- 在计算机中,采用数字化方式来表示数据。数据有无符号数和带符号数之分,带符号数根据其编码的不同又有原码、补码和反码3种形式。
- 在C语言中,八进制数常以前缀0开始,十六进制数以前缀0x开始。
无符号数
- 整个机器字长的全部二进制均表示数值位。
带符号数
- 带符号数,即正、负数。
- 在日常生活中,我们用正负号加绝对值来表示,称为真值。
- 由于计算机无法识别正负号,所以需要把数的符号数码化。约定二进制的最高位为符号位,“0”表示正号,“1”表示负号。这种形式的数成为机器数。
- 常见的机器数有原码、补码和反码三种表示形式。
- 01001:表示+9.
- 11001:如果是原码则表示-9,补码表示-7,反码表示-6.
原码表示法
- 最高位作为符号位(若字长为5位则最高位为尾数第5位,字长为8位则为第8位),数值部分与真值相同。
- 我们用X表示真值,举例(所有例子字长为5位):
- X1=0.0110, [X1]原=0.0110;//整数部分是0则直接用来作为符号位
- X2=-0.0110, {X2]原=1.0110;
- X1=1101, [X1]原=01101;
- X2=-1101, [X2]原=11101;
- [+0]原=00000;
- [-0]原=10000
反码表示法
- 先转为原码形式,然后正数的数值部分不变,负数则数值部分按位取反;也就是相对补码形式少了加1这一步。
- X1=0.0110, [X1]反=0.0110
- X2=-0.0110, [X2]反=1.1001
- [+0]反=00000
- [-0]反=11111
补码表示法
- 先变成原码,然后正数的数值部分不变,负数的真值部分则 按位取反,再加1.
- X1=0.0110, [X1]补=0.0110;
- X2=-0.0110, [X2]补=1.1010
- [+0]补=[-0]补=00000 //本来-0的补码应该是100000,但是超过5位了,所以舍弃首位1.
- 故要往回推发现不能-1时,肯迪你个是舍掉首位的1所致,先补回首位1,再来-1。
比较
- 对于正数它们都等于真值本身。
- 补码和反码的符号位可以和数值位一起参加运算,但原码的不行。
- 设字长为4位:
- 其中,-8的源码本来应该是1000,其反码应该是数值部分取反,4位全为数值部分,故其反码应为0111,再加1得其补码1000.往回推时先用1000-1得0111,发现首位被-1改变,则可确定首位也是数值部分,那么4位都取反得1000,因为首位已确定也为数值部分,因此它只可能是-8,不可能是-0.
- 由此可见,补码相比原码多表示了一个最负的负数。
定点数与浮点数
- 根据小数点的位置是否固定,在计算机中有两种数据格式:定点表示和浮点表示。
定点数
- 真值到原码、反码、补码的方式相同。
- 定点小数
-
定点小数即纯小数,小数点的位置固定在最高有效数位之前(即最高小数位之前)、符号位之后。
-
也即是说整数位只有一位,固定为符号位,任何情况下不作为数值部分,定点小数一律<1。
-
当符号位为0时,表示一个正数。
- 最大可表示0.111…,即1-2^-n(设机器字长为n+1位)。
- 最小可表示0.000…1,即2^-n。
-
当符号位为1时,表示一个负数。
- 若为原码表示法,则最负可表示-0.111…,即-(1-2^-n): [X]原=1.111…
- 若为补码表示法,则最负可表示-1:[X]补=1.000…;倒推回去:-1->0.111…,取反->1.000…,真值->-1。同样是比原码多表示了一个最负的负数,想象一下,-0.111…最低位再加1是不是就变成-1。
-
原码定点小数的表示范围为-(1-2-n)~(1-2-n)
-
补码定点小数的表示范围为-1~(1-2^-n)
- 定点整数
-
定点整数即纯整数,小数点位置隐含固定在最低有效数位之后。
-
也就是说,和普通整数一样。
-
原码定点整数的表示范围为-(2n-1)~(2n-1)
-
补码定点整数的表示范围为-2n~(2n-1)
浮点数
- 小数点的位置根据需要而浮动,这就是浮点数。
- 表示形式类似科学计数法,如,二进制数0.0001101表示为0.0011012(-01),0.01101*2(-10),
0.11012(-11),……,即N=M*rE,M叫做尾数,为纯小数,常用原码或补码表示,E叫做阶码,为纯整数,常用移码或补码表示。 - E相对于M相当于移位数,E<0,小数部分右移,空出来的部分补0。
- 如果都用补码表示,那么格式如下:
-
其实就是前半部分为一个整数,后半部分为一个小数。
-
当es=0,ms=0,阶码和尾数的数值位都为1(即阶码和尾数都为最大正数)时,该浮点数为最大正数:
X=(1-2-n)*2(2^k-1)。
-当es=0,阶码的数值位全为1;ms=1,尾数的数值位全为0(即阶码为最大正数,尾数为最小负数(最负负数))时,该浮点数表示最小负数:-1*2(2k-1)。 -
规格化浮点数:最上面表示中,只有0.1101*2^(-11)是规格化数。
-
在尾数用源码表示时,规格化浮点数的最高数位总等于1.
-
用补码表示时,尾数最高数位与符号位不同,也就是为正数时,最高数位为1,为负数时,最高数位为0.