再发贴求助:C/C++中强制类型转换的实现过程
上次发贴就问过这个问题,但是没找到足够满意的答案,所以再发贴。
int x = 0X7fffffff;
cout << (int)(float)x; //就是这个转换过程没理解
float y = x;
cout << (int)y;
这两次输出的值是不一样的。上次有人给我回复说是某个强制类型转换的内部函数的参数实际上是double型,所以精度是足够的(第一次的输出结果),还是输出0x7fffffff。但是我一直有个疑问,(float)x这个过程,编译器到底做了什么?是直接在x的位置上直接改成float的表示形式???如果是这样,结果就不应该是0x7fffffff了。
求高人扫盲!!!最好能从底层的函数讲讲
[解决办法]
反汇编
int x = 0X7fffffff;00411E8E mov dword ptr [x],7FFFFFFFh cout << (int)(float)x; //就是这个转换过程没理解00411E95 fild dword ptr [x] 00411E98 call @ILT+440(__ftol2_sse) (4111BDh) 00411E9D mov esi,esp 00411E9F push eax 00411EA0 mov ecx,dword ptr [__imp_std::cout (41D3E8h)] 00411EA6 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41D430h)] 00411EAC cmp esi,esp 00411EAE call @ILT+645(__RTC_CheckEsp) (41128Ah) float y = x;00411EB3 fild dword ptr [x] 00411EB6 fstp dword ptr [y] cout << (int)y;00411EB9 fld dword ptr [y] 00411EBC call @ILT+440(__ftol2_sse) (4111BDh) 00411EC1 mov esi,esp 00411EC3 push eax 00411EC4 mov ecx,dword ptr [__imp_std::cout (41D3E8h)] 00411ECA call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41D430h)] 00411ED0 cmp esi,esp 00411ED2 call @ILT+645(__RTC_CheckEsp) (41128Ah)
[解决办法]
无汇编,无真相!