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

时间:2012-06-29 23:18:06

标签: c gcc 64-bit 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

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

1 个答案:

答案 0 :(得分:15)

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

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

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