A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

©   /  2014-3-17 14:14  /  1304 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 bao9107 于 2014-3-18 14:44 编辑



1、如果编译器执行如下强转代码:
  1. #include <stdio.h>
  2. int main()
  3. {
  4.   float f = 12.8f;  //定义强转的float类型的f值
  5.   printf("转换前f:%f\n",f);  //打印出强转前的值 方便对比
  6.   int *p ;  // 定义int 类型的指针p
  7.   p = (int *)(&f); // 先取到f的地址,然后强制转换为指向int类型的指针
  8.   printf("转换后f:%d\n",*p); // 打印输出转换后的值
  9.   return 0;
  10. }
复制代码
可是结果却出乎意料:




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



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马