【发布时间】:2013-09-25 22:18:33
【问题描述】:
我刚刚检查了 C++ 标准。看来下面的代码不应该是undefined behavior:
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 具有带符号类型和负值,则结果 value 是实现定义的。
根据标准,由于 34 不是负数,所以变量 res 将为 0。
GCC 对代码 sn-p 给出以下警告,res 是67108863:
警告:右移计数 >= 类型宽度
我还检查了 GCC 发出的汇编代码。它只是调用SHRL,而英特尔的 SHRL 指令文档中,res 不是零。
那么这是否意味着 GCC 没有在英特尔平台上实现标准行为?
【问题讨论】:
-
你给出的标准引用是关于第一个操作数的,即
val,而不是34。 -
@ChristianRau,你是对的。
标签: c++ gcc assembly standards undefined-behavior