float在内存中占4个字节(32bit),32bit=符号位(1bit)+指数位(8bit)+底数位(23bit) 指数部分 指数位占8bit,可以表示数值的范围是0-255(表示0~255一共256个数),因为指数可正可负,所以IEEE规定,此处算出的次方必须减去127才是真正的指数,所以float的指数范围是 -127(0-127) 到+128(255-127)。 底数部分 任何一个数的科学记数法都可以表示为1.xxx*2^n,小数部分就可以表示为xxx,整数部分永远是1,不影响精度,所以可以不用储存。23bit二进制可以表示的最大值是2^23=8388608,一共7位,这意味着最多能有7位有效数字(不能表示比8388608大的数值),但绝对能保证的为6位,即float的精度为6~7位有效数字。 以8.25为例: 8.25=1000.01 1000.01的科学记数法是1.00001*2^3 符号位,正数为0,负数为1 指数=3,即x-127=3,因此x=130,所以指数位应该是120,对应的二进制数是10,000,010 底数=00001,不足补0,所以23bit对应的二进制数是00,001,000,000,000,000,000,000 所以最终在内存中二进制数是 0 10,000,010 00,001,000,000,000,000,000,000 4个字节的值是 65 4 0 0
说明:本人主机的字节序是大端字节序,所以顺序相反
double存储方式和float相同,区别在于64bit=符号位(1bit)+指数位(11bit)+底数位(52bit)指数部分算出的次方必须减去1023才是真正的指数,double的小数部分可以表示的最大值是2^52=4,503,599,627,370,496,这意味着最多能有16位有效数字,但绝对能保证的为15位,即double的精度为15~16位有效数字。
时间: 2024-10-03 14:55:43