例题
运用整形提升的场景
无符号类型整数打印可能会出现的问题
浮点数(float和double)在系统中的存储方式和取出方式
由这个题目可以知道,整数和浮点数的存储方式,置于为什么,后面会有解释。
我们先来了解一下浮点数的存储方式
根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:
(-1)^S * M * 2^E
(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
M表示有效数字,大于等于1,小于2。
2^E表示指数位
图中就是二进制浮点数的存方式
而浮点数分为float型和double型
浮点数的S M E这三个别以这样的比例在这个存储方式存储在计算机中
IEEE 754对有效数字M和指数E,还有一些特别规定。
前面说过, 1≤M
IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的
xxxxxx部分。比如保存1.01的时
候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位
浮点数为例,留给M只有23位,
将第一位的1舍去以后,等于可以保存24位有效数字。
我总结一下上面这一段的文字:浮点数中M这一部分,因为M肯定是1
所以存储的时候整数位不存储,这样就空出来一位,可以继续存储一位小数,这样会更精准。
而当要用这个变量的时候,系统再将这个整数1加上去就好了啊。
至于指数E,情况就比较复杂。
首先,E为一个无符号整数(unsigned int)
从上面我们可以知道,E其实是一个指数,所以E可能会是负数,但他这边规定E是无符号整数,这里冲突了怎么办呢?
我们这边对应的处理方法:
我们在float的存储模式中发现E有八位,而double有11位。
E而我们的E只有一位,我们需要把E转换为二进制放进去,这里就有可以操作的地方了啊
规定:float型.将E的值加上127在转换成二进制,就是E是负数也可以变为正数,然后进行转换。
double型.将E的值加上1023在转换成二进制,就是E是负数也可以变为正数,然后进行转换。
我们了解E的存储形式,能存进去就可以取出来,那怎么取出来呢?
有三种情况
E不全为0或不全为1
这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将
有效数字M前加上第一位的1。
E全为0
其实E全为0就是先减到-127,这样的话E就变成-124,而2的-127次方就非常非常小,无线接近0.
E全为1
这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);
ok了,我们可以啦解决一些之前的那个问题了啊