为什么有不同的INT64_MIN的定义是什么? 他们为什么不同的表现?(Why are ther

2019-07-30 04:16发布

stdint.h在我的公司头写着:

#define INT64_MIN -9223372036854775808LL

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

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

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

error: integer constant is so large that it is unsigned

这两种定义似乎是等价的。
为什么一个编译罚款和其他失败?

Answer 1:

-9223372036854775808LL不是一个单一的文字。 它是由一元的表达-操作者施加到恒定9223372036854775808LL

该常量是(勉强)类型的范围之外long long ,这会导致发出警告。

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



文章来源: Why are there differing definitions of INT64_MIN? And why do they behave differently?
标签: c gcc 64-bit min