如果我在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/