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

Gag*_*ira 2 c++ bit-shift undefined-behavior

int main() 
{
  int x = -2;

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

(1<<-2)输出垃圾值。

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

Vla*_*cow 12

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

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

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

  1. ...操作数应为整数或无范围枚举类型,并执行整数提升。结果的类型是提升后的左操作数的类型。如果右操作数为负或大于或等于提升的左操作数的宽度,则该行为是不确定的。