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

How does shift operator work with negative numbers in c++

本文关键字:c++ 运算符      更新时间:2023-10-16
int main() 
{
  int x = -2;
  cout << (1<<x) << endl;
  cout << (1<<-2) << endl;
}

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

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

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

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

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

同样写在

C++标准(C++20,7.6.7 Shift 运算符(

  1. 。操作数应为整体或无作用域枚举类型,并且 执行整体促销。结果的类型是 提升的左操作数。行为未定义,如果 操作数为负数,或大于或等于 提升左操作数。

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

第 118 页,第 5.8.1 节:

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

这意味着编译器可以在这里做任何它想做的事情 - 所有的赌注都关闭了。