float和double变量的内存布局
来源:互联网 发布:c语言or符号 编辑:程序博客网 时间:2024/05/16 11:35
浮点数在c/c++以及java中的内存布局遵循IEEE标准的,首先看一下IEEE所规定的存储的方式:
解释一下,首先float变量按上述标准是4个字节,其中最高位为符号位,1代表此浮点数为负数,0代表正数,接下来的8位为指数位,范围0~255,,IEEE规定了一个偏移量127,指数位的值减去127为小数的偏移。低23位为小数部分,这23位是来描述浮点数的值,偏移为0的情况下,这23位数是一个浮点数的小数部分,也就是说位于小数点的右边。比如
0x3fc00000
符号位:0 ->说明是正数。
指数位:011 1111 1 -->偏移0
小数位:100 0000 0000 0000 0000 0000,-->1.10000000000000000000000为1.5
而按照规定,小数点前还隐含包括1,而这个1是不储存的,所以小数位实际是1.5,当偏移大于0时,小数点向右偏移相应的值,反之向左偏移相应的值。
以上就是IEEE的存储的基本原理,现在验证下,加深印象
- #include <iostream>
- using namespace std;
- int main()
- {
- float a=0.0;
- unsigned char *p=(unsigned char *)&a;
- *p=0;
- p++;
- *p=0;
- p++;
- *p=0xc0;
- p++;
- *p=0x3f;
- cout<<a<<endl;
- system("pause");
- }
- //输出1.5
0x40c00000
符号位:0 ->说明是正数。
指数位:100 0000 1 -->偏移2
小数位:100 0000 0000 0000 0000 0000,
由于偏移为2,1.100 0000 0000 0000 0000 0000变成了110.0 0000 0000 0000 0000 0000 所以0x40c00000值为6,同理0x3f400000值为0.75.
类似的我们可以明白double变量的内存布局了。由于小数位的计算方式比如11.11111...在计算时为1*2^1+1*2^0+1*2^(-1)+1*2^(-2)....可以看出在表示小数时,flaot的值不是连续的,事实上浮点数,以IEEE标准所能精确表示的仅仅是其中的一部分。
例如0.3,就不能被float所精确表示,如下面代码:
- #include <iostream>
- using namespace std;
- int main()
- {
- float a=0.3;
- cout.precision(20);
- for (int i=0;i<4;i++)
- {
- cout<<int(*(unsigned char*)((int)&a+i))<<endl;
- }
- cout<<a<<endl;
- system("pause");
- }
可以算出float所能精确表示的个数,32位每位两个有限的状态~~~~~
了解了float布局,相应的下面代码问题的原因也就找到了~~~~
- #include <iostream>
- using namespace std;
- int main()
- {
- float a=2;
- int *p=(int*)&a;
- cout<<*p<<endl;//为什么输出的不是2
- cout<<a<<endl;
- system("pause");
- }
- float和double变量的内存布局~~~~~~
- float和double变量的内存布局~~~~~~
- float和double变量的内存布局~~~~~~
- float和double变量的内存布局~~~~~~
- float和double变量的内存布局
- float和double变量的内存布局
- float和double的内存布局
- float & double 内存布局
- float & double 内存布局
- float & double 内存布局
- float & double 内存布局
- int, float和double的内存结构
- float和double类型的内存分布
- float 和double的内存特点
- 基本数据类型操作三:float和double变量的赋值
- float和double类型的内存分布和比较方法
- float和double类型的内存分布和比较
- float和double类型的内存分布和比较方法
- VC++得到任务栏的高度和位置的方法
- 《俄罗斯方块》今夏坠入PS4/Xbox One
- SQL Server---存储过程
- 黑马程序员--高新技术--泛型
- 关于java中finally中的语句在return前还是后执行的个人理解。
- float和double变量的内存布局
- 统计一个字符串中的单词的个数,并打印各个单词
- 同一个项目中使用Swift和Objective-C
- MonoForAndroid的按钮单击事件及监听器的实现方式
- php练习题
- Math对象 四舍五入取值
- 高效管理ASP.NET的JavaScript库,把JS文件嵌入到DLL中
- 盘菩提子串珠盘的是心情
- tcp跟包分析