我刚刚检查了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
从标准来看:
E1 >> E2 的值是 E1 右移 E2 位位置。如果 E1 具有无符号类型或 E1 具有带符号类型和非负值,则结果的值是 E1/2^E2 的商的整数部分。如果 E1 具有带符号类型和负值,则结果值是实现定义的。
根据标准,由于 34 不是负数,因此变量res
将为 0。
GCC 为代码片段提供以下警告,并且res
是67108863
:
警告:右移计数 >= 类型宽度
我还检查了 GCC 发出的汇编代码。它只是调用SHRL
,并且 SHRL 的英特尔指令文档res
不是零。
那么这是否意味着 GCC 没有在英特尔平台上实现标准行为?