繁体   English   中英

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

[英]How does shift operator work with negative numbers in c++

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移位运算符)中也写了相同的内容

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

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

第118页,第5.8.1节:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM