计算机内数字的表示
计算机中的数字有三种表示:无符号数、补码(带符号数)、浮点数
信息的存储与寻址:计算机中将字节作为最小可寻址单元。而字节的排列顺序分大端法和小端法两种。大端法就是指将最高位放在最前面的存储方式,而小端法则是将最低位放在最前面的存储方式。
C语言中的移位运算:
- 左移:将x向左移动k位,丢弃最高的k位,并在右端补k个0
- 逻辑右移:将x向右移k位后,在左端补k个0
- 算术右移:将x向右移k位后,在左端补k个最高有效位的值。
带符号数与无符号数的转换:
带符号数->无符号数:若x<0,则返回x+2w
若x>=0,则返回x
无符号数->带符号数:若x<=TMax,则返回x
若x>TMax,则返回x-2w
整数的扩展:将一个较小类型的数,转换为较大类型
无符号数,在数字的二进制表示的开头添0,这被称为零扩展
带符号数,在数字的二进制表示的开头添加最高有效位的值符号扩
整数的截断:将一个较大类型的数,转换为较小类型
无符号数,先将数字的二进制表示直接转换成对应的无符号数,然后再用这个无符号数进行模2的k次方运算
带符号数,先将数字的二进制表示直接转换成对应的无符号数,然后再用这个无符号数进行模2的k次方运算,然后经过模运算后得到的无符号转转换成带符号数。
无符号数加法:若x+y≥2w(溢出),则为x+y-2w;否则为x+y
溢出判断:令s=x+y,当且仅当s<x或者s<y时,发生了溢出
无符号数的非:若x=0,则为x,否则为2w-x
带符号数加法:若x+y≥2w-1,则为x+y-2w(正溢出);若x+y<-2w-1,则为x+y+2w(负溢出);否则为x+y
溢出判断:令s=x+y,当且仅当x>0,y>0,但s<=0时,发生了正溢出;当且仅当x<0,y<0,但s>=0时,发生了负溢出
带符号数的非:若x=TMIN,则为x,否则为-x
无符号数的乘法:(x*y) mod 2w
带符号数的乘法:U2T((x*y) mod 2w)
乘以2的幂:对于无符号数,C表达式x<<k产生x*2k的值
对于带符号数,C表达式x<<k产生x*2k的值
除以2的幂:无符号数处以2的幂,C表达式x>>k产生数值 floor( x/2k )
带符号数除以2的幂,向下舍入,C表达式x>>k产生数值 floor( x/2k )
带符号数除以2的幂,向上舍入,C表达式 ( x+(1<<k)-1)>>k 产生数值 ceil( x/2k )
浮点数:IEEE浮点标准用V=(-1)s * M * 2E的形式来表示一个浮点数
- 在规格化的表示中,exp段既不是全1,也不是全0。在这种情况下,阶码字段被解释为以偏置形式表示的有符号数。也就是说,阶码的值E=exp-Bias,其中exp是一个k位的无符号数,而Bias则等于2k-1-1(即最高位为0,其余位为1)。而尾数定义为M=1+frac。
- 在非规格化的表示中,即阶码域位全0的形式,在这种情况下,阶码值是E=1-Bias,而尾数的值是M=frac,也就是小数字段的值。
- 在特殊情况下,当阶码域位全1的时候,如果小数字段位全0则表示无穷大,如果小数字段不为全0则表示这不是一个数(NaN)
浮点数的特殊值总结:
以一个8位的浮点数为例:
浮点数的舍入:
- 向偶数舍入(即四舍五入)
- 向零舍入
- 向下舍入(相当于ceil函数)
- 向上舍入(相当于floor函数)
C语言中的浮点数:
从int转换成float,数字不会溢出,但是可能被舍入。
从int或float转换成double,因为double有更大的位数,所以能够保留精确的数值。
从double转换成float,因为范围较小,所以值可能溢出成+∞或-∞。并且,由于精度较小,它还可能被舍入。
从float或者都变了转换成int,值将会向零舍入。