IEEE754标准:(-1)^S*1.M*2^E按照这个公式进行存放
(-1)^S:符号位s=0,则为1是正;s=1,则为-1是负.
1.M:表示大于等于1,并且小于2的数字。M则是≥0<1的数字
2^E:表示一个二进制数字,通过科学计数法后得到数字。
如:5.5
二进制为:101.1 --->可以表示为:(-1)^0*1.011*2^2
则:S=0,M=011,E=2
在内存中的存储方式:
S存放在第一位表示正负
E放中间float是8个bit位,double是11个bit位
IEEE754规定了E中存放的第一位不用来表示正负,但是又避免不了有负数,比如:0.15--------------->(-1)^0*1.5*2^(-1)。因此,IEEE754规定将这里得到的数+127(double:+1023),然后再存入E中, float类型的范围在[-127,128]。(这里我有一个问题,为什么不给符号位呢?给了范围也在[-128,127],这样的区别应该也不大吧...如果有大佬可以解决这一疑问请私信我,或者评论,感谢!!!)
M在float中占23bit位,在double中占52bit位,得到的M在后面补0,比如前面说的5.5,得到1.011则M=011存放时,float存放的M就是:0110000000000000000000(23bit)
那看看5.5再内存中的存放:101.1 --->可以表示为:(-1)^0*1.011*2^2
S=0(5.5是正数)
E=2,IEEE754规定要+127因此,E=2+127=129
M=011
SEM带入得到float类型:0(S-1bit)10000001(E-8bit)011(补0)00000000000000000000(M-23bit)
最后就是:01000000101100000000000
内存:
完全没问题。
上面是存放
下面是取出
这是正常情况,这么放也就这么取。
IEEE754还规定了,E为全0和E位全1的情况
补充:
E全为0:
1-127(1-1023),0.xxx,原本是0-127,1.xxx。(向后退了一位)。
如果有错误的还麻烦大佬们提醒一下,博主也是在学习当中,非常热爱计算机领域!