首页 > 解决方案 > 移位运算符如何在c ++中处理负数

问题描述

int main() 
{
  int x = -2;

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

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

}

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

(1<<-2)打印一个垃圾值。

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

标签: c++undefined-behaviorbit-shift

解决方案


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

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

相同的写在 C++ 标准(C++20、7.6.7 移位运算符)

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

推荐阅读