深入理解计算机系统(4)-- 整数和浮点数
整数
二进制到无符号十进制数的表示为
负数的表示
二进制表示负数的值为例如
补码表示
二进制中补码就是对2的补数,例如两位有符号二进制数,10、11、00、01。-1补码是11,01对2的补数=11-01+1=11,所以11就是-1的补码表示;-2对2的补数=11-10+1=10,所以-2的补码表示就是10。最小的负数10看上去就是最大整数01的延伸。这对于多位的二进制或者多进制数都是成立的。
无符号数的加法
无符号加法可以视为一种模运算形式,无符号加法等价于和模上2的w次方。
实际上无符号加法运算会发生溢出。实际应用时,我们可能要判断是否发生溢出。假设位宽为w位,可以通过s<x(或者s<y,两者等价)来判断。我们假设s=x+y,如果没有发生溢出,则s>x一定成立;如果发生了溢出,那么此时的s=x+y-2^w,由于y<2^w,所以s一定小于x,同理s也一定小于y。
浮点数
先看十进制小数的表示方法。
以上图的十进制小数为例,其数值为
小数点“.”表示权,类似的对于二进制小数
小数点左移表示这个数除以2,右移表示这个数乘以2。其数值为
增加表示二进制小数的位数长度可以增加表示精度。这叫做定点表示。但是这种表示方法是没办法表示非常大的数值的。一般采用IEEE浮点数表示法,
单精度浮点数中,s、exp和frac字段分别为1位、k=8位和n=23位,得到一个32位的表示。
双精度浮点数中,s、exp和frac字段分别为1位、k=11位和n=52位,得到一个64位的表示。如图所示
其中阶码的值决定了这个数是规格化的、非规格化的还是特殊值。
当exp的位模式既不全为0也不全为1,那么它是规格化的浮点数,规格化值是最普遍的情况;此时阶码的值为E=e-Bias,其中e就是阶码域的值,Bias值为,对于单精度为127(阶码域为8位),双精度为1023(阶码域为11位),表示权的偏置值。尾数的值为M=1+f,其中f就是尾数域的值,表示为。
当阶码域全为0时,它表示的就是非规格化的值;此时阶码E=1-Bias,尾数M=f。浮点数+0.0就是一个非规格化数。s为0、E为0(非规格化数)、M=f=0。非规格化数的另外一个功能是表示非常接近于0的数值。
当阶码域全为1时,它表示的是特殊值。比如,尾数域全为0,表示无穷数,s=0则是正无穷,s为1则是负无穷。当尾数域不全为0时,表示“NAN”,不是一个数值。
假设我们现在用6位格式来表示浮点数,其中k=3,n=2,也就是有三位阶码域,两位尾数域。对于规格化数,Bias=3,数值的最大值为0 110 11,E=110(二进制)-3=6-3=3,M=1.11最大数值为1110也就是+14,最小数值为-14。如下图所示
当用8位二进制来表示浮点数,嘉定k=4,n=3,偏置量Bias=8-1=7。三类数的范围取值如下图所示