[C]类型转换问题,求解释
int m = 8;
printf("%d\n",2<<(43+m));
printf("%d\n",2<<(51));
为什么第二条输出0
[解决办法]
- C/C++ code
int m = 8;00412A8E mov dword ptr [m],8 printf("%d\n",2<<(43+m));00412A95 mov ecx,dword ptr [m] 00412A98 add ecx,2Bh 00412A9B mov eax,2 00412AA0 shl eax,cl 00412AA2 mov esi,esp 00412AA4 push eax 00412AA5 push offset string "%d\n" (4247FCh) 00412AAA call dword ptr [__imp__printf (4294F0h)] 00412AB0 add esp,8 00412AB3 cmp esi,esp 00412AB5 call @ILT+1320(__RTC_CheckEsp) (41152Dh) printf("%d\n",2<<(51));00412ABA mov esi,esp 00412ABC push 0 00412ABE push offset string "%d\n" (4247FCh) 00412AC3 call dword ptr [__imp__printf (4294F0h)] 00412AC9 add esp,8 00412ACC cmp esi,esp 00412ACE call @ILT+1320(__RTC_CheckEsp) (41152Dh)
[解决办法]
首先 当移位超出宽度时,这种行为在C标准中是未定义的,即编译器可以自己决定怎么处理。
而这个例子中,使用常数51时,编译器在编译阶段可以检测出51超出宽度并对其进行优化。
而使用变量,则在编译阶段无法发现超宽。
例如,你改成使用常变量的方法,const int m=8;就会跟直接使用51一样了。因为常变量可以在编译阶段知道值。