[英]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移位运算符)中也写了相同的内容
- ......操作数应为整数或无范围的枚举类型,并执行整体促销。 结果的类型是提升的左操作数的类型。 如果右操作数为负数,或者大于或等于提升的左操作数的宽度,则行为未定义。
在标准中, 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.