郑飞龙 17:17:04
int main() { float a=1.0f; cout <<"boolalpha "<<( (int)a==(int &)a ) <<endl; float b=0.0f; cout <<"boolalpha "<<( (int)b==(int &)b ) <<endl; return 0; } 这个是一道面试题,不知道这题是什么意思?beyond(jzk) 17:19:55我也弄不明白...beyond(jzk) 17:20:15我感觉输出应该是false true郑飞龙 17:20:45答案就是这样郑飞龙 17:20:49你是怎么看出来的beyond(jzk) 17:22:43float 1.0f = 0x37ff..反正是浮点数的表示.. float 0.0 =0.beyond(jzk) 17:24:411.0=3f80000h郑飞龙 17:24:48恩,内存中好像就是这样的beyond(jzk) 17:24:490.0=00000000beyond(jzk) 17:25:22(int)a = ftoi(a)=1.郑飞龙 17:25:38恩,后面的呢beyond(jzk) 17:25:54(int&)a=0x3f800000郑飞龙 17:26:23为什么(int &)a 郑飞龙 17:26:46就是你说的那个值呢beyond(jzk) 17:27:03我感觉(int &)a=(int)(int*)a郑飞龙 17:27:19这个意思是不是相当与把一个浮点数当作整形给输出了beyond(jzk) 17:27:40(int)a这个比较明显=1.郑飞龙 17:27:49恩,这个比较明显beyond(jzk) 17:28:41(int&)a我理解的就是把a的内容也就是0x3f800000转换成一个地址=0x3f800000beyond(jzk) 17:30:38这个题应该是考的浮点数的内存表示吧..郑飞龙 17:31:10int & r = (int &)a;郑飞龙 17:31:32那么这里的r应该怎么理解?郑飞龙 17:32:04r 是你刚才说的那个地址是对应的郑飞龙 17:33:00cout<<r,相当于输出了0x3f800000单元的内容?beyond(jzk) 17:33:24..我看晕了..郑飞龙 17:36:21但是我输出r,r的值还是0x3f800000beyond(jzk) 17:36:23哪个公司的面试题 郑飞龙 17:36:44EMC郑飞龙 17:36:51易安信beyond(jzk) 17:37:30如果输出是0x3f800000的话,那应该得有一个中间变量..beyond(jzk) 17:37:53你调试看一下..郑飞龙 17:38:12你说的中间变量,指的是什么 ?beyond(jzk) 17:39:10(int&)a,不然r引用的地址在哪里..beyond(jzk) 17:40:41你看看(int&)a 是不是等于(int)(int*)a郑飞龙 17:40:50我调试的时候看,VC好像给r开了一个空间,那个空间存的内容就是a变量的地址。beyond(jzk) 17:41:34那样的话,r就是一个指针了..郑飞龙 17:42:07我估计底层都是这样实现的beyond(jzk) 17:42:20可能吧..beyond(jzk) 17:43:08再遇到这种题,可以现根据自己的理解解答..郑飞龙 17:44:32调试的时候,&r和a的地址一样,真让人费解郑飞龙 17:44:42编译器把我都搞晕了beyond(jzk) 17:45:37...郑飞龙 17:46:09调试是这样,我晕的不行,实在是理解不了郑飞龙 17:48:32算了,太细了,也没什么意思beyond(jzk) 17:48:37这样理解你看行不行,反正引用肯定对应一个变量..郑飞龙 17:48:48恩beyond(jzk) 17:49:15对于int& r=(int&)a.这个句子里面只有一个变量a郑飞龙 17:49:23恩beyond(jzk) 17:49:52所以r应该是a的地址别名..郑飞龙 17:50:01恩beyond(jzk) 17:50:08a的地址里放的是0 3f800000beyond(jzk) 17:50:190x3f800000郑飞龙 17:50:56恩beyond(jzk) 17:51:29不管a是什么类型,他地址里的16进制内容是一样的..郑飞龙 17:51:42恩beyond(jzk) 17:52:42只是因为引用的类型是int型的,所以输出的是3f800000的int型值..beyond(jzk) 17:54:00float& m=(float&)a;beyond(jzk) 17:55:37(float&)a==a郑飞龙 17:56:01恩,我明白了一点beyond(jzk) 17:56:41(int&)a==*(int*)&a(int&)a 是取地址,地址类型转换,取内容的简写形式.相当于*(int*)&a;不管a是什么类型 (int&)a==*(int*)&a这个等式都成立float a=1.0f;int& r=(int&)a;这一句是后,r是一个指向a地址的int型引用,输出r相当于输出a地址的整形内容对于这个例子cout<<r<<endl;的结果为0x3f800000.
