⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_36634.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:36634 发表者:星际浪子 发表日期:2003-04-17 11:42:27
<br>主题:(江湖告急)为什么a 不等于 b?
<br>内容:#include &lt;iostream&gt;<BR>using namespace std;<BR>void main()<BR>{<BR> int tmp = 32;<BR> int b = 2 &lt;&lt; tmp;<BR> int a = 2 &lt;&lt; 32;<BR> cout &lt;&lt; a &lt;&lt; endl &lt;&lt; b &lt;&lt; endl;<BR>}<BR><BR> <BR>为什么a 不等于 b?<BR><BR><BR>2 &lt;&lt; 32 因为int为32位所以编译时就overflow当作0, 结果a=0;<BR><BR>但是 int b = 2 &lt;&lt; tmp;通过反汇编的结果就是<BR><BR>mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,2<BR>mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx,dword ptr [ebp-4] ;/* ptr [ebp-4] 为tmp的地址指针,内容为32 <BR>shl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* 为逻辑左移,右边的位补0<BR>mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-0Ch],eax&nbsp;&nbsp; /* ptr [ebp-0Ch] 位变量b的地址指针<BR><BR>但是最后的结果b =2 ,why?<BR><BR>代码修改为<BR>#include &lt;iostream&gt;<BR>using namespace std;<BR>void main()<BR>{<BR> int tmp = 30;<BR> int b = 2 &lt;&lt; tmp;<BR>tmp =2 ;<BR> b = 2 &lt;&lt; tmp;<BR> int a = 2 &lt;&lt; 32;<BR> cout &lt;&lt; a &lt;&lt; endl &lt;&lt; b &lt;&lt; endl;<BR>}<BR><BR>结果就变成 b = 0; why?<BR><BR>反汇编出的代码是一样的,只不过是先移了30位,再移2位就变成0了;<BR><BR>但是如果一次性移动&gt;=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&lt;&lt;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 + -