7

我公司的stdint.h标题是:

#define INT64_MIN -9223372036854775808LL

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

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

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

error: integer constant is so large that it is unsigned

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

4

1 回答 1

19

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

该常数(几乎)在 type 的范围之外long long,这会导致警告。(我假设long long是 64 位,几乎可以肯定是。)

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

于 2012-06-29T23:20:53.023 回答