表达式 | 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,都不应该输出它的地址。
>> 本文固定链接: http://www.vcgood.com/archives/1473
支持支持楼主啊