我公司的stdint.h
标题为:
#define INT64_MIN -9223372036854775808LL
但在我项目的一些代码中,程序员写道:
#undef INT64_MIN
#define INT64_MIN (-9223372036854775807LL -1)
然后他在代码中使用了这个定义
该项目编译时没有任何警告/错误
当我试图删除他的定义并使用默认定义时,我得到了:
error: integer constant is so large that it is unsigned
这两个定义似乎是等价的 为什么一个编译好,另一个失败?
答案 0 :(得分:15)
-9223372036854775808LL
不是单个文字。它是一个由应用于常量-
的一元9223372036854775808LL
运算符组成的表达式。
该常数(几乎不在)long long
类型的范围之外,这会导致警告。
另一方面,表达式(-9223372036854775807LL -1)
包含long long
范围内的文字, 是{{1}的更有效定义因为它是正确的类型(正如Steve Jessop在评论中指出的那样)。