类型转换
c语言的定点整数都是补码存储:short int long
强制类型转换不改变数据内容,只是改变解释方式
长整数变短整数,高位截断,保留低位
短整数变长整数符号扩
数据存储和排列
大小端模式
最高有效字节MSB
最低有效字节LSB
地址从低到高
大端:MSB存放在低地址位置,LSB存放在高地址位置(便于人类阅读)
小端:MSB存放在高地址位置,LSB存放在低地址位置(便于机器处理)
边界对齐
现代计算机通常是按字节编址,即每个字节对应1个地址
通常也支持按字、按半字、按字节寻址。
假设存储字长为32位,则1个字=32bit,半字=16bit。每次访存只能读/写1个字
于是N字节的数据,必须存储在KN字节的位置
浮点数
浮点数的表示
尾数反映精度,阶码反映数值大小
阶码E反映浮点数的表示范围及小数点的实际位置;
尾数M的数值部分的位数n反映浮点数的精度。
阶码:常用补码或移码表示的
整数尾数:常用原码或补码表示的小数
阶码:常用补码或移码表示的定点整数
尾数:常用原码或补码表示的定点小数
浮点数的规格化
阶码的底通常是2
尾数最高值是无效值会丧失精度
规格化浮点数:规定尾数的最高数值位必须是一个有效值
左规:当浮点数运算的结果为非规格化时要进行规格化处理将尾数算数左移一位,阶码减1。
右规:当浮点数运算的结果尾数出现溢出(双符号位为01或10)时,将尾数算数右移一位,阶码加1。
规格化浮点数的特点:
1.用原码表示的尾数进行规格化:
正数为0.1xx..x的形式,其最大值表示为0.11...1;最小值表示为0.10...0。
尾数的表示范围为1/2<=M<=(1-2^-n)。
负数为1.1xx...x的形式,其最大值表示为1.10...0;最小值表示为1.11...1.
尾数的表示范围为-(1-2^-n)<=M<=-1/2。
规格化的原码尾数,最高数值位一定是1
2.用补码表示的尾数进行规格化
正数为0.1xx.xx的形式,其最大值表示为0.11...1;最小值表示为0.10...0。
尾数的表示范围为1/2<=M≤(1-2^-n)。
负数为1.0xx..x的形式,其最大值表示为1.01...1;最小值表示为1.00...0.
尾数的表示范围为-1<=M<=-(1/2+2^-n)。
规格化的补码尾数,符号位与最高数值位一定相反
IEEE 754
只有 1<=E≤254时,真值=(-1)^Sx1.Mx2^(E-127)
隐含最高位变为0 阶码真值固定视为 -126
当阶码E全为0,尾数M不全为0时,表示非规格化小数 ±(0.xx..x),x2^-126
当阶码E全为0,尾数M全为0时,表示真值 ±0
当阶码E全为1,尾数M全为0时,表示无穷大±∞
当阶码E全为1,尾数M不全为0时,表示非数值“NaN”(Not a Number)
由浮点数确定真值(阶码不是全0、也不是全1)
1、根据“某浮点数”确定数符、阶码、尾数的分布
2、确定尾数1.M (注意补充最高的隐含位1)
3、确定阶码的真值=移码-偏置值(可将移码看作无符号数,用无符号数的值减去偏置值)
4、(-1)X1.MX2^(E-偏置值)
浮点数的加减运算
尾数的溢出未必导致整体溢出。也许可以通过3、4步拯救
阶码溢出则这个数就一定溢出
舍入:
“0”舍“1”入法:
类似于十进制数运算中的“四舍五入”法,即在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1。这样做可能会使尾数又溢出,此时需再做一次右规。
恒置“1”法:
尾数右移时,不论丢掉的最高数值位是“1”还是“0”都使右移后的尾数末位恒置“1”。这种方法同样有使尾数变大和变小的两种可能。