Why are there differing definitions of INT64_MIN?

2019-04-01 01:55发布

问题:

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?

回答1:

-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.

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).



标签: c gcc 64bit min