目录
1.浮点数
2.浮点数在内存中的存储
- 之前介绍的整型的范围:char、short、int等的范围可以在limits.h头文件中查找
- float、double浮点型可以在float.h头文件中查找
- 例如: 9.0
- 对应的二进制为 1001.0 ,科学计数法为 1.001 * 2 *3
- 写成上面的形式为:(-1)^s * M * 2^E = (-1)^0 * 1.001 * 2^3
- 所以:s = 0,M = 1.001 ,E = 3
对于有效数字M和E的额外规定:
- 因为M总是写成1.XXX , 1被省去,多一个精度,拿出来的时候补上1
- 对于指数E:E是个无符号整数,由于科学计数法可能有负数,所以E填入内存时加上一个中间数。对于float+127,对于double+1023
- 对于E从右往左,对于M从左往右。也就是E左边补0,M右边补0
3.指数E从内存中取出三种情况
E不为全0或者全1:
- E减去127(或者1023)得到E的真实值。
- M补上1.XX
E为全0:
- 真实的E是-127,说明原来的数字超级小
- 直接规定:E等于1-127(或者1-1023),有效M不再加一,还原为0.XX。
- 这样做是为了表示+- 0 ,以及接近 0 的很小的数字
E为全1:
- 真实的E是128 , 几乎为+- 无穷大的数字,不作讨论
4.例题
- 首先,9在内存中的补码为
- float* 看待内存为float类型
- 那么E为全 0 ,所以M不再补,E为1-127,还原为:(%f默认打印6位)
- 将9.0浮点数放入内存中,二进制位 1001.0
- 科学计数法为1.001 * 2 ^ 3
- s = 0,E = 3+127 = 130 ,M = 001
- 而%d打印整数,n也是整数,认为内存中存储的是补码。最高位为0,所以为正数,补码等于原码,值为