本帖最后由 bao9107 于 2014-3-18 14:44 编辑
1、如果编译器执行如下强转代码:
- #include <stdio.h>
- int main()
- {
- float f = 12.8f; //定义强转的float类型的f值
- printf("转换前f:%f\n",f); //打印出强转前的值 方便对比
- int *p ; // 定义int 类型的指针p
- p = (int *)(&f); // 先取到f的地址,然后强制转换为指向int类型的指针
- printf("转换后f:%d\n",*p); // 打印输出转换后的值
- return 0;
- }
复制代码 可是结果却出乎意料:
2、所以我分析下他的运行过程
1)首先你要知道float在内存中是如何保存的。浮点型变量在计算机内存中占用4字节(Byte),即32-bit,遵循IEEE-754格式标准。存储第一位为符号位,接下来八位是指数位,后23位为有效数字位。
2)明白 float f =12.8 在内存中存储的二进制形式 ,如下图所示
a、当我们执行float f =12.8;这语句时,它在内存保存的是二进制:0 1000 0010 100 1100 1100 1100 1100 1100;
b、p = (int *)(& f);这句是是先取到f的地址,然后强制转换为指向int类型的指针
c、printf("转换后f:%d\n",*p); 这用十进制打印出转换的值,其实就是把12.8的二进制,转换成了十进制打印出来即:
二进制:0 1000 0010 100 1100 1100 1100 1100 1100 =》十进制:1095552205
|