📄 subject_36634.htm
字号:
<p>
序号:36634 发表者:星际浪子 发表日期:2003-04-17 11:42:27
<br>主题:(江湖告急)为什么a 不等于 b?
<br>内容:#include <iostream><BR>using namespace std;<BR>void main()<BR>{<BR> int tmp = 32;<BR> int b = 2 << tmp;<BR> int a = 2 << 32;<BR> cout << a << endl << b << endl;<BR>}<BR><BR> <BR>为什么a 不等于 b?<BR><BR><BR>2 << 32 因为int为32位所以编译时就overflow当作0, 结果a=0;<BR><BR>但是 int b = 2 << tmp;通过反汇编的结果就是<BR><BR>mov eax,2<BR>mov ecx,dword ptr [ebp-4] ;/* ptr [ebp-4] 为tmp的地址指针,内容为32 <BR>shl eax,cl /* 为逻辑左移,右边的位补0<BR>mov dword ptr [ebp-0Ch],eax /* ptr [ebp-0Ch] 位变量b的地址指针<BR><BR>但是最后的结果b =2 ,why?<BR><BR>代码修改为<BR>#include <iostream><BR>using namespace std;<BR>void main()<BR>{<BR> int tmp = 30;<BR> int b = 2 << tmp;<BR>tmp =2 ;<BR> b = 2 << tmp;<BR> int a = 2 << 32;<BR> cout << a << endl << b << endl;<BR>}<BR><BR>结果就变成 b = 0; why?<BR><BR>反汇编出的代码是一样的,只不过是先移了30位,再移2位就变成0了;<BR><BR>但是如果一次性移动>=32位,感觉就变成循环左移了,why?
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:星际浪子 回复日期:2003-04-17 12:50:41
<br>内容:请高手解惑,别不作声呀!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:Fang 回复日期:2003-04-17 13:41:43
<br>内容:vc参考手册是怎么说的,“如果右操作数大于或等于提升的左操作数中的位为单位的宽度,则一个位移运算的结果是不确定的。”----就是说结果不保证正确。<BR><BR>另外,真正的原因在这里,intel的IA-32手册上说,“The destination operand can be a register or a memory location. The count operand can be an immediate value or register CL. The count is masked to 5 bits, which limits the count range to<BR>0 to 31. A special opcode encoding is provided for a count of 1.”你写了32,其实被当作0来移位,结果是2。<BR><BR>至于,2<<32是编译器自己先检查了,认为溢出,直接给一个0作为结果。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Fang 回复日期:2003-04-17 13:43:01
<br>内容:天哪,太难贴上来了。服务器总出错。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:星际浪子 回复日期:2003-04-17 14:31:24
<br>内容:ok,总算搞清楚了!这是我原来华为的同事在跳槽到另外公司时碰到的一道面试题!<BR>THANKS, fang
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Fang 回复日期:2003-04-17 14:39:42
<br>内容:这种题稀奇古怪,不做也罢。<BR>还有华为,它出的题,也是不分对象,形而上学。<BR>个人以为,这种题考不出水平。最多考出个见多识广,知之为知之,不知不为耻。反正我是看看手册才知道,否则也是乱猜一气。<BR>2003-4-17 14:44:52
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -