为什么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指出的那样)评论)。