任何人都可以帮助我理解以下行为。(1 << 32)和(1 << i)之间的区别其中i == 32
1 #include <iostream>
2
3 using namespace std;
4
5 main()
6 {
7 uint32_t i = 32;
8
9 // cout << "(1<<32): " << (1<<32) << endl; // - This leads to a compilation error.
10 cout << "(1<<32): " << (1<<i) << endl; // - This compiles and prints 1 - Why?
11
12 return 0;
13 }
如果我取消注释行数9以上 - 我看到下面的编译错误(这对我来说很有意义)
BitWiseLeftShift.c++: In function 'int main()':
BitWiseLeftShift.c++:9: warning: left shift count >= width of type
但行号10是我的问题是。它编译成功和打印
(1<<32): 1
东西就像一个循环位移。为什么要打印1? 我已经看到,i == 33
,(1<<i)
打印2.
我没有搜索论坛,找不到相关的问题。如果这是一个重复的问题 - 请帮助我一个链接。
在这两种情况下它都是未定义的行为,所以推测是毫无意义的。 –
C++ 11§5.8p1几乎说你只要移位等于或大于底层类型的位数,就会被洗掉。 – WhozCraig