为什么INT64_MIN的定义不同? 为什么他们的行为不同?

我公司的stdint.h标题是:

 #define INT64_MIN -9223372036854775808LL 

但在我项目的一些代码中,程序员写道:

 #undef INT64_MIN #define INT64_MIN (-9223372036854775807LL -1) 

然后他在代码中使用此定义。
该项目编译时没有警告/错误。
当我试图删除他的定义并使用默认定义时,我得到了:

 error: integer constant is so large that it is unsigned 

这两个定义似乎是等价的。
为什么一个编译好,另一个失败?

-9223372036854775808LL不是单个文字。 它是一个由一元运算符组成的表达式-运算符应用于常量9223372036854775808LL

该常数(几乎)不在long long类型的范围之外,这会导致警告。

另一方面,表达式(-9223372036854775807LL -1)包含在long long范围内的文字,并且对INT64_MIN 同样是一个更有效的定义,因为它的类型正确(正如Steve Jessop指出的那样)评论)。