Why are there differing definitions of INT64_MIN? And why do they behave differently?
64-bit, c, gcc, min
Solution
`-9223372036854775808LL` is not a single literal. It's an expression consisting of a unary `-` operator applied to the constant `9223372036854775808LL`.
That constant is (barely) outside the range of type `long long`, which causes the warning. (I'm assuming `long long` is 64 bits, which it almost certainly is.)
The expression `(-9223372036854775807LL -1)`, on the other hand, contains literals that are within the range of `long long`, and is an equally a more valid definition for `INT64_MIN`, since it's of the correct type (as Steve Jessop points out in a comment).
Problem
The `stdint.h` header at my company reads: ``` #define INT64_MIN -9223372036854775808LL ``` But in some code in my project, a programmer wrote: ``` #undef INT64_MIN #define INT64_MIN (-9223372036854775807LL -1) ``` He then uses this definition in the code. The project compiles with no warnings/errors. When I attempted to remove his definition and use the default one, I got: ``` error: integer constant is so large that it is unsigned ``` The two definitions appear to be equivalent. Why does one compile fine and the other fails?