I have the following program:

int main()
    int64_t a = 241294423792285589;
    printf("a = %lld, a << 63 = %lld", a, a << 63);
    return 0;

I was expecting a << 63 to be 0, but it prints out:

a = 241294423792285589, a << 63 = -9223372036854775808

Why is this?

3 Answers

John On Best Solutions

If you convert these integers to signed 2's complement binary you can see why:

241294423792285589 in binary is


Shifting this left by 63 spots will result in the right-most 1 ending up in the left-most binary digit:


Which in 2's complement binary is -9223372036854775808.

You can find binary <-> decimal converters online (such as this one: https://www.rapidtables.com/convert/number/decimal-to-binary.html) that can help make this more clear.

Or you can even try this bitshift calculator: https://bit-calculator.com/bit-shift-calculator

AnT On

Your shift expression has undefined behavior. There's no value you can meaningfully expect from that shift.

In C behavior of left shift E1 << E2 for signed E1 is described by 6.5.7/4

If E1 has a signed type and nonnegative value, and E1 × 2E2 is representable in the result type, then that is the resulting value; otherwise, the behavior is undefined.

Luis Colorado On

The problem is that you left shift an odd number (a number with the least signifiant bit set) 63 places to the left in a 64 bit word. The value you obtain is




that (in two's complement) is the number you post in your question.

Anyway, shifting 63 places a signed 64bit number is undefined behaviour, so that means that you can receive anything at all... event that huge negative number.