如果我在32位平台上声明了int类型的值,请执行以下操作:

int32_t mask;
mask = 1 << 31: // produces 2147483648 (or 0x80000000)

有人可以帮我理解为什么以上行会产生警告:
The result of the '<<' expression is undefined

最佳答案

231t在int32_t中无法表示,它从-231变为(231-1)。这是C11和C++ 11中的未定义行为,而在C++ 14中是实现定义的行为。

C11§6.5.7/ p4(引用N1570):



N3337§5.8[expr.shift] / p2中的C++ 11规则几乎相同。由于231无法表示,因此行为未定义。

C++ 14§5.8[expr.shift] / p2(引用N3936;另请参见CWG issue 1457):



由于231可在32位无符号int中表示,因此将定义行为,并将结果转换为231t_code;此转换是根据§4.7[conv.integral] / p3实现定义的。在使用二进制补码的典型系统中,您将得到-231。

关于c++ - 1 << 31产生错误, “The result of the ' <<' expression is undefined”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26319592/

10-11 19:39