移位运算符如何在C ++中使用负数

时间:2019-07-18 10:27:53

标签: c++ undefined-behavior bit-shift

int main() 
{
  int x = -2;

  cout << (1<<x) << endl;

  cout << (1<<-2) << endl;

}

(1<<x)打印1073741824(如何计算)

(1<<-2)显示垃圾值。

为什么这两个返回不同的答案?

2 个答案:

答案 0 :(得分:12)

根据C标准(6.5.7位移位运算符)

  

3对每个操作数执行整数提升。的   结果的类型是提升后的左操作数的类型。 如果   右操作数的值是负数或大于或等于   提升的左操作数的宽度,行为是不确定的

在C ++标准(C ++ 20、7.6.7 Shift运算符)中也是如此

  
      
  1. ...操作数应为整数或无范围枚举类型,并且   进行整体促销。结果的类型是   提升后的左操作数。 如果行为正确,则不确定   操作数为负,或大于或等于   提升为左操作数。
  2.   

答案 1 :(得分:2)

在标准中,http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf

第118页,第5.8.1节:

  

如果右操作数为负,则行为未定义,或者   大于或等于提升的左位的长度(以位为单位)   操作数

意味着编译器可以在这里完成任何操作-所有赌注都关闭了。