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?
-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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With