Zij*_*gWu 32 c++ assembly standards gcc undefined-behavior
我刚检查了C++标准.看来以下代码不应该是未定义的行为:
unsigned int val = 0x0FFFFFFF;
unsigned int res = val >> 34; // res should be 0 by C++ standard,
// but GCC gives warning and res is 67108863
Run Code Online (Sandbox Code Playgroud)
并从标准:
E1 >> E2的值是E1右移E2位位置.如果E1具有无符号类型或者E1具有有符号类型和非负值,则结果的值是E1/2 ^ E2的商的整数部分.如果E1具有有符号类型和负值,则生成的值是实现定义的.
根据标准,由于34不是负数,因此变量res将为0.
GCC为代码段提供以下警告,并且res是67108863:
警告:右移计数> =类型的宽度
我还检查了GCC发出的汇编代码.它只是调用SHRL,而SHRL的英特尔指令文件res不是ZERO.
那么这是否意味着GCC没有在英特尔平台上实现标准行为?
Mat*_*son 17
要准确解释发生了什么:编译器将加载34到寄存器中,然后加载到另一个寄存器中的常量,并使用这两个寄存器执行右移操作.x86处理器对移位值执行"shiftcount%bits",这意味着您的右移为2.
由于0x0FFFFFFF(十进制268435455)除以4 = 67108863,这就是你看到的结果.
如果你有一个不同的处理器,例如PowerPC(我认为),它可能会给你零.