搞了很久都不明白,问了很多人也解答不了,高手帮帮忙吧

zhouhong0801 2007-10-15 10:31:51
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到底是输出的什么东东啊?

为什么呢?请高手指教!
...全文
213 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouhong0801 2007-10-16
  • 打赏
  • 举报
回复
谢谢ls诸位的解释,基本上明白了。

这个的确是一个笔试题,所以搞不清楚让我觉得很别扭,呵呵。
0黄瓜0 2007-10-15
  • 打赏
  • 举报
回复
2的30次方为1073741824
0黄瓜0 2007-10-15
  • 打赏
  • 举报
回复
float a = 1.0f;
则a的内存bit状态为:
0x3F800000,00111111 10000000 00000000 00000000

float a = 2.0f;
则a的内存bit状态为:
0x40000000,01000000 00000000 00000000 00000000
星羽 2007-10-15
  • 打赏
  • 举报
回复

cout <<(int&)a << endl;

cout << *((int*)&a)<<endl;
等价
0黄瓜0 2007-10-15
  • 打赏
  • 举报
回复
cout << (int&)a << endl;// 这个应该是a的地址
============================
这个不是输出a的地址,而是将a的内存状态按int数解释.
hastings 2007-10-15
  • 打赏
  • 举报
回复
int&是引用
直接cout<<&a<<endl;才是输出地址.
whvcliker 2007-10-15
  • 打赏
  • 举报
回复
这道题目的真正目的也是如何达到不同类型的值进行判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
0黄瓜0 2007-10-15
  • 打赏
  • 举报
回复
这道题目说明相同的内存,可以解释为不同的内容,全看你需要.

float数的,指数部分只要是全0,这个数就被解释为0.
float b=0.0f,则b代表的内存处的bit位简单置为全0.
zhouhong0801 2007-10-15
  • 打赏
  • 举报
回复
就算(int&)b是把b的内存状态按照十进制输出,那么为什么当b=0.0f的时候,他的内存状态就是0呢?b=0.0f和b为空是不同的概念呀。

我的理解是,b的类型确定了,在内存中分配的大小就是确定的。b的取值的差别对内存的状态有什么改变呢?

这道题目应该如何理解比较简单?
ppass 2007-10-15
  • 打赏
  • 举报
回复
你的表达式根本就错误了..

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

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

意义都不同的.我这个绝对对.
ppass 2007-10-15
  • 打赏
  • 举报
回复
int a;
a的地址是: int(&a);

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧