首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

[C]类型转换有关问题,求解释

2012-04-10 
[C]类型转换问题,求解释int m 8printf(%d\n,2(43+m))printf(%d\n,2(51))为什么第二条输出0[

[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一样了。因为常变量可以在编译阶段知道值。

热点排行