浮点数在内存中的存储(数据在内存中的储存补充)
常⻅的浮点数:3.14159、1E10等,浮点数家族包括:float 、 double 、 long double 类型。浮点数表⽰的范围: float.h 中定义我们先来看看这个题目:n 和 * pFloat 在内存中明明是同⼀个数,他们其实最终表示出来的都是数字9,为什么浮点数和整数的解读结果会差别这么大呢?
要想知道这个问题的话,就必须要明白浮点数在内存中的存储方式
举例来说:
⼗进制的5.0,写成⼆进制是101.0 ,相当于 1.01×2^2,因为是把他给写成了二进制位的数字了,所以就是2的次方数,移动了多少就是多少次方数。M表示的是有效数字,按照上面的表述,M就是1.01,S表示的是正负号,当S为0的时候,就表示正数,当S为1的时候,就表示负数。E表示的是指数位,在上面E就是2.
这是十进制的浮点数进行转换的方式。
他是几进制,底数就是几
在进行浮点数的存储时,E和M他都是有限制的。
浮点数取的过程:
1. E不全为0或不全为1(常规情况)
这时,浮点数就采⽤下⾯的规则表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效 数字M前加上第⼀位的1。 ⽐如:0.5的⼆进制形式为0.1,由于规定正数部分必须为1,即将⼩数点右移1位,则为1.0*2^(-1),其 阶码为-1+127(中间值)=126,表⽰为01111110,⽽尾数1.0去掉整数部分为0,补⻬0到23位 00000000000000000000000,则其⼆进制表⽰形式为:0 01111110 00000000000000000000000
E全为0
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还 原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字。
0 00000000 00100000000000000000000
E全为1
这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s)
0 11111111 00010000000000000000000
我们再回来看这个问题,n变量等于9,他是正整数,原码反码补码都是一样的,我们把9的原码反码补码都写出来,取出n的地址,然后强制类型转换成float*类型的,那么我们就根据他的二进制的补码,来给成float*类型的补码,然后根据浮点数二进制的表示形式,就可以得出来它的数值,这是通过%f的类型来进行打印,但是如果我们使用%d来打印,还是可以的。
然后我们通过浮点数类型的解引用给他修改值的时候,因为他是浮点数,索引理所当然的9.0就换成浮点数类型的二进制补码类型,然后根据浮点数类型的特殊运算式,就可以推出来整型数字的二进制数字,因为他的要求是%d的方式来进行打印,打印的是整数,所以我们就得换成整型数字的二进制形式来进行打印,得出的结果就如上图所示。但是如果他要求的是按照%f打印浮点数类型来进行打印,那我们就不用进行换了,因为她本身就是浮点数类型。
原文地址:https://blog.csdn.net/daiwoliyunshang/article/details/143818067
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!