C ++由于转换位位移包?

问题描述 投票:-2回答:1

可能有人解释这种现象?

#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”是一个较小的类型不是一个unsigned long。用“1UL”,而不是使行为完全正常的,所以必须有一些与类型转换回事,但我很好奇,想知道到底是什么,为什么!

c++ type-conversion bit-shift literals
1个回答
4
投票

如果逐位移右操作数的值是负的或者是大于或等于在推动左操作数的比特数,该行为是未定义。

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

的行为是不确定如果将右操作数是负的,或者大于或等于在推动左操作数的位长度。

还有的解释中未定义行为的行为没有任何意义,因为它是不确定的。

© www.soinside.com 2019 - 2024. All rights reserved.