由于转换导致C ++位移换行?

时间:2019-02-07 18:07:29

标签: c++ type-conversion bit-shift literals

有人可以解释这种行为吗?

#include <iostream>
using namespace std;
int main(){
    for(int i = 0; i <= 32; i++){
        unsigned long test = 1u << i;
        cout << test << endl;
    }
}

输出:

1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576
2097152
4194304
8388608
16777216
33554432
67108864
134217728
268435456
536870912
1073741824
2147483648
1

直到最后才有意义。位移运算符不应该自动换行,但是在这里似乎正是在这样做。我想这是因为文字'1u'是一个比无符号长整数小的类型。相反,使用“ 1ul”可以使行为完全正常,因此类型转换一定会发生某些事情,但是我很好奇确切地知道什么以及为什么!

1 个答案:

答案 0 :(得分:4)

如果用于按位移位的右操作数的值为负或大于或等于提升后的左操作数的位数,则行为不确定。

来自https://timsong-cpp.github.io/cppwp/n3337/expr.shift#1

  

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

并且没有解释未定义行为的行为的意义,因为它是未定义的。