Apple出品
1例题所示
如图↓
打印结果如图所示
为什么这里的*pFloat打印出来是0呢,这便涉及到浮点数字存储的问题
2浮点数的存储方式
浮点数表达方式(-1)^s * M *2^E
s为0则为正数,s为1则为负数
M表示1-2的数字(类似科学计数法)
E则为指数(也就是小数点移动的位数,向左为正,向右为负)
在32比特位的机器上,S M E的比特位是有规定的
S:1bit
E:8bit
M:23bit
在64位比特位的机器上,S M E的比特位是这样规定的
S:1bit
E:11bit
M:52bit
这里我们的M的范围都统一规定了是1-2,所以说我们在存储的时候可以把1给省去,变为0.0几的计数方式。这样M的存储位数从23变为24,2的23和2的24位完全是2个不同的数字,大大提高了数据的范围。
因为E是一个无符号整数,然而在科学计数法里面E是可以取到负数的,所以我们根据IEEE规定,E在存储的时候是要+127的。
例如我们看一个例子 float a = 5.5;(无需加f,因为有隐式类型转换)
5.5的二进制是这样的:101.1
S = 0;
M = 1.011;
E = 2;
存储在内存中是这样的(省去整数的1)
0 10000000 01100000000000000000000
然而这只是存储方式,从内存中取出的还依据E的情况分为3种情况
3浮点型数据从内存中取出的方式
3.1E有0又有1
因为M=23个0,取出来的时候M=1.0,而阶码是01111110,那么取出来的时候减去127,得到-1
3.2E全为1
E如果全为1,那么E真实值就相当于255-127 = 128,可见这个数字是多么庞大,那么这个浮点数就是相当于正负无穷大。
3.3E全为0
E如果全为0,那么E真实值就相当于1-127 = -126(32bit), 1-1023=-1022(64bit)。可见这个数字是多么小,那么这个浮点数就相当于正负0,也就是0
4例题详解
n就为n,那么打印整形n,值就是9。
*pFloat是将整形n强制类型转换为float,那么就要依靠浮点数的存储规则。
{
9的二进制是00000000 00000000 00000000 00001001
这是32位机器,那么依照1 8 23的bit取
0 00000000 00000000000000000001001
由此可见E全为0,由上面的结论可知,这个数字为0,那么打印结果就是0
}
*pFloat = 9.0
9.0的浮点型数据二进制中是这样的
1001.0->1.0010 * 10^3
也就是E等于3+127 = 130;
0 10000010 00100000000000000000000
因为此时把浮点数变为了整形在内存中的补码形式,最高位为符号位是0,所以正数的原码反码补码是一样的,因此这个数字也就是
而打印*pFloat也就是打印float类型仍然是9.0
5浮点数计算总结
一:给定整形数字,求打印出来的浮点数是多少
1:整形->补码
2:按照1 8 23或者1 11 52的bit取,分别作为S E M,并且这是从内存中取出浮点数的情况,要根据E的情况而定(参照我上面)
二:给定浮点型数字,求打印出来的整形数字是多少
1:写出浮点型数字的2进制表达方式 如9.0->1001.0
2:写出这样的二进制的S M E,如上面的是S=0; M=1.0010; E=3+127=130,一定要注意存储浮点数的时候E要+127或者1023
3:按照S E M的顺序,写出浮点数在内存中存放的补码形式
4:根据整形数字的补码反码原码原则,计算出这个整形数字
本篇博客到此结束,感谢浏览和访问!
本人的博客链接