Źle przesuwane bity

0

Mam prostą rzecz do policzenia:

#include <iostream>

unsigned int i = 5;
uint64_t c;

int main() {

    c = 1 << (i + 32);
    std::cout << c;

    return 0;
}

Wynik powinien wynosić 137438953472, czyli 2^37, natomiast dostaję wynik 32. Nie ma to dla mnie żadnego sensu. Co się dzieje w tym kodzie?

Ponadto jak wpiszę:

c = 1 << 37;

To dostaję 0. Przesunięcia bitowe działają inaczej w c++ niż przesunięcia bitowe?

8

A warningi czytasz?
Dla 1 << 32 mam warning: left shift count >= width of type [-Wshift-count-overflow]. Spóbuj:

uint64_t one = 1;
uint64_t c = one << 37;

Update - w zasadzie to powinno starczyć

uint64_t c = 1l << 37;
3

tak nawiasem mówiąc nie wiem d oczego ci to potrzebne ale możesz zastanowić sie nad std::bitset
https://en.cppreference.com/w/cpp/utility/bitset

4

W jego przypadku warning nie wyskakuje, bo shift zależy od zmiennej.
Ale za to sanitizer wykrywa problem
https://godbolt.org/z/hP6jz4frK
vs
https://godbolt.org/z/rdaeYK1cE

1 użytkowników online, w tym zalogowanych: 0, gości: 1