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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

本帖最后由 牧之 于 2014-3-18 12:19 编辑

float  f=12.8;
int *p;
如果我想把f赋值给p指针,他们之间的类型肯定要转换,请问怎么实现这种类型的转换?

4 个回复

倒序浏览
本帖最后由 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



回复 使用道具 举报
p = (int *)(&f);
回复 使用道具 举报
指针与数据最好是同类型的,这样移动一个单位才能指向下一个数据,强制转换没意义啊
回复 使用道具 举报
LZ:代码:
float  f=12.8;
int *p;
如果我想把f赋值给p指针,他们之间的类型肯定要转换,请问怎么实现这种类型的转换?

把f 赋值给p指针 , lz 的意思是  f的数值 而 不是地址 吗

// 这是值转换,  转换什么值要看接受的是什么类型
#include <stdio.h>
int main()
{
        float f = 12.8;
        int a, *p = &a ;
        *p = (int)f;
        printf(" %d\n", *p);
        return 0;

}
//

如果LZ 是说的  内存地址转换,内存地址是没有类型的


#include <stdio.h>

int main()
{
        float tmpF = 1.28, *ptrF;
        int *ptrI;
        ptrF = &tmpF;
        ptrI = ptrF;
        //*ptrI = 12.5;   LZ 可以试试加上这句
        printf(" ptrF = %p, ptrI = %p\n", ptrF, ptrI);
        printf(" tmpF = %f, *ptrF = %f, *ptrI = %d\n", tmpF, *ptrF, *ptrI);
        return 0;
}
输出:
ptrF = 0xbf9a8cb4, ptrI = 0xbf9a8cb4   // 指向的地址是一样的
tmpF = 1.280000, *ptrF = 1.280000, *ptrI = 1067702026


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