Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988498
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-20 10:58:47

表达式 g++中类型 g++中值 vc++中类型 vc++中值
(const float&)0x3f99999a; int 1067030938 float 1.06703e+09
(const float&)(const int&)0x3f99999a; float 1.2 float 1.06703e+09
(float&)(const int&)0x3f99999a; 编译失败 编译失败 float 1.2
const int tmp = 0x3f99999a;
(const float&)tmp;
float 1.2 float 1.06703e+09
const int tmp = 0x3f99999a;
(float&)tmp;
float 1.2 float 1.2
说明:int(0x3f99999a) 和 float(1.2) 在内存中的数据是一样的。

看来只有最后一种方法是通用的,C中可以写成 *(float*)&tmp;

另外,在VC2005中 (float&)(const int&)0x3f99999a 竟然可以编译成功,这定然是个bug:
cout << &(int&)(const int&)0x3f99999a << endl;
在VC2005中编译运行成功,输出了常数 0x3f99999a 的地址,而 常数 应当是没有地址的,无论VC2005使用何种实现方法,比如使用一个变量来存储 0x3f99999a,都不应该输出它的地址。
阅读(1009) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-20 10:59:27

微风
好匪夷所思的手法,有空试试

网友评论2012-11-20 10:59:20

请输入你的姓名
我汗
啥时候能用到如此晦涩的写法呢