int main()
{
int x = -2;
cout << (1<<x) << endl;
cout << (1<<-2) << endl;
}
(1<<x)
打印1073741824(如何计算)
(1<<-2)
显示垃圾值。
为什么这两个返回不同的答案?
答案 0 :(得分:12)
根据C标准(6.5.7位移位运算符)
3对每个操作数执行整数提升。的 结果的类型是提升后的左操作数的类型。 如果 右操作数的值是负数或大于或等于 提升的左操作数的宽度,行为是不确定的
在C ++标准(C ++ 20、7.6.7 Shift运算符)中也是如此
- ...操作数应为整数或无范围枚举类型,并且 进行整体促销。结果的类型是 提升后的左操作数。 如果行为正确,则不确定 操作数为负,或大于或等于 提升为左操作数。
答案 1 :(得分:2)
在标准中,http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf
第118页,第5.8.1节:
如果右操作数为负,则行为未定义,或者 大于或等于提升的左位的长度(以位为单位) 操作数
意味着编译器可以在这里完成任何操作-所有赌注都关闭了。