读书人

搞了很久都不明白问了很多人也解答不

发布时间: 2012-02-22 19:36:54 作者: rapoo

搞了很久都不明白,问了很多人也解答不了,高手帮帮忙吧
float a = 1.0f;
cout << (int)a << endl; // 这个是a的值,为1
cout << (int&)a << endl; // 这个应该是a的地址
cout << boolalpha << ( (int)a == (int&)a ) << endl; // 所以输出是false

float b = 0.0f;
cout << (int)b << endl; // 这个是b的值,为0cout << (int&)b << endl; // 这个也应该是地址,但是编译输出也是0cout << boolalpha << ( (int)b == (int&)b ) << endl; // 输出了true,迷惑的地方

后来,我把b的取值改成非零,比如 float b = 2.0f; 然后(int)b就是2,(int&)b输出1073741824。
我实在不明白这里(int&)b到底是输出的什么东东啊?

为什么呢?请高手指教!


[解决办法]
cout << (int&)a << endl;// 这个应该是a的地址
============================
这个不是输出a的地址,而是将a的内存状态按int数解释.

[解决办法]
你的表达式根本就错误了..

float a = 1.0f;
int b = int(&a);
int c = (int&)a;

你观察下b和c的值,完全不一样.
b是a的地址
c是a的内存状态,= 0x3F800000.换成10进制是1065353216

意义都不同的.我这个绝对对.
[解决办法]
这道题目的真正目的也是如何达到不同类型的值进行判0操作的问题,对于浮点数,由于在内存中表达的方式与整型值不同,
整型值采用四个字节来进行表示(32位机器),而浮点数则不能简单地采用四个字节来表示,对于进行强制类型转换得到的
int&类型值,当然会只取浮点数的内存前四个字节的值再进行整型转化,这里由程序强制编译器对内存进行再解释,而不是
由编译器进行内部的数值直接转换,而当进行非引用的类型转换时,则由编译器内部进行,这样不会进行内存的再次解释,
从反汇编代码可以看到:
20: int c = (int) t;
004015AF fld dword ptr [ebp-4]
004015B2 call __ftol (00420df8)//调用的是编译器内存的数值转换函数
004015B7 mov dword ptr [ebp-8],eax

21: int& a = (int&) t;
004015BA lea eax,[ebp-4]//取内存地址,再对内存进行重新解析
004015BD mov dword ptr [ebp-0Ch],eax

值为0.0时,判0操作会返回true,是因为,内存中的前四个字节此时也为0,故转换成整型值,再与浮点0.0进行比较,作一
次整型到浮点的转换,自然相等。

这种在同一表达式中进行两次类型的强制转换只会在考人的题目中会出现,在我们的程序中最好避免:
(int&/*作了一次int引用的强制类型转换,由程序进行内存再次解释*/)b == (int/*作了一次从浮点到整型值的转换,由编译器进行截断处理*/)b

读书人网 >C++

热点推荐