C ++ bithift обертывания из-за преобразования? - PullRequest
0 голосов
/ 07 февраля 2019

Может ли кто-нибудь объяснить это поведение?

#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' является меньшим типом, чем беззнаковый long.Использование «1ul» вместо этого делает поведение совершенно нормальным, поэтому с преобразованием типов должно что-то происходить, но мне любопытно точно знать, что и почему!

1 Ответ

0 голосов
/ 07 февраля 2019

Если значение правого операнда для побитового сдвига является отрицательным или больше или равно количеству битов в повышенном левом операнде, поведение не определено.

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

Поведение не определено, если правый операнд отрицательный или больше или равен длине вбиты повышенного левого операнда.

И нет смысла объяснять поведение неопределенного поведения, потому что оно неопределено.

...