C left shift on 64 bits fail

64-bit, bit-shift, c

Solution

Because `1` is an `int`, 32 bits, so `(1 << 27)*27` overflows. Use `1ull`.

Regarding your comment, if `x` is a `uint64_t`, then `1 << x` is still an `int`, but for the multiplication it would be cast to `uint64_t`, so there'd be no overflow. However, if `x >= 31`, `1 << x` would be undefined behaviour (as the resulting value cannot be represented by a signed 32 bit integer type).

Problem

I have this code in C (it's for study only): ``` char x; uint64_t total = 0; for(x = 20; x < 30; x++){ total = (((((1 << x) * x) / 64) + 1) * sizeof(uint64_t)); printf("%d - %llu\n", x, total); } ``` What is printed: ``` 20 - 2621448 21 - 5505032 22 - 11534344 23 - 24117256 24 - 50331656 25 - 104857608 26 - 218103816 27 - 18446744073625665544 28 - 18446744073575333896 29 - 18446744073508225032 ``` Why at x > 26 do I have those strange values? I'm at gcc 4.6.1 on Ubuntu 10.10 64 bits.

Original source

Related problems