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