在Visual Studio编译以下C代码时,结果为4。
void main() { int c = 1; c = c<<34;}
从Visual Studio反汇编窗口看到的汇编代码是
shl eax,22h
从汇编开始,我们很容易看到我们正在转移34.由于这里的整数是4个字节,从结果来看很明显,模数运算是在机器级别上进行的,以使其工作为2。
我想知道这种行为是跨平台标准化还是跨平台变化?
发生未定义的行为。 这是由语言标准标准化的(参见1999年C标准的6.5.7 Bitwise shift operators
)。 然而,UB的可观察效果不是标准化的,并且可能有所不同。
至于shl eax, 22h
,CPU的移位计数将被截断为5位(参见文档),这条指令实际上将表现为shl eax, 2
。
根据MSDN上的这篇文章 :
如果移位表达式的右操作数为负或者右操作数大于或等于(提升的)左操作数中的位数,则结果为未定义。 如果右操作数为零(0),则不执行移位操作。
需要了解更多c/c++开发分享如果我们按位移动一个超过其大小的整数会发生什么,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享如果我们按位移动一个超过其大小的整数会发生什么相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/957957.html