问题引入:整型家族在内存中存储时有大端、小端模式。而浮点型是怎么在内存中存储的:
根据国际标准IEEE 754(电气工程师协会),任意一个二进制浮点数v可以表示成以下形式:
# (-1)^S*M*2^E
# (-1)^S表示符号位,当S=0时:v为正数。当S=1时:v为负数
# M表示有效数字位
# 2^E表示指数位
IEEE 754规定:对于32位浮点数,最高1位是符号位S,接着8位是指数E,剩下的23位为有效数字M。
对于64为浮点数,最高位是符号位S,接着11位是指数E,剩下52位为有效数字M。
IEEE 754规定:计算机内部保存M时,默认这个数的第一位总是1,因此可以舍去,只保留后面的小数部分。这样做的目的可以节省空间。
节省了1位有效数字,使得保留的有效数字多1位,因此M就是24bit。
对于指数E:E位一个无符号整数,这意味着,如果E为8位,它的取值范围为0~255.E为11位,取值范围为(0~2047)
IEEE 754规定:存入内存时E的真实值必须加上一个中间数。
E(8bit):255/2=127
E(11bit):2047/2=1023
例如创建变量float f=5.5存入内存(转化成二进制:101.1)
得到:S=0
M=1.011
E=2
给E的真实值加上127--------------->2+127=129
所有得到:0 10000001 01100000000000000000000
S E M
那么如何从内存中取出呢?(分3中情况)
@E不全为0或不全为1
浮点数采用下面的规则表示:即指数E的计算值减去127(或者1023).得到真实值。在将有效数字M前加上第一位的1.
(由于规定有效数字M正数部分必须为1,即小数点右移一位)
@E全为0
显然读取E的时候:0-127=-127,那么2^E=2^-127会趋于无穷小(0).计算机此时的浮点数就会表示为0
@E全为1
这时2^E就会非常大:255-127=128.即达到浮点数的极值。