为什么INT64_MIN的定义不同?为什么他们表现不同?

abe*_*nky 3 c 64-bit gcc min

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在评论中指出的那样).

  • @Keith:C99的7.18.2说的是"INT64_MIN","这个表达式的类型与根据整数提升转换的相应类型的对象的表达式相同".所以你的定义比提问者的雇主的定义更有效,不是同样有效的:`INT64_MIN`*的类型必须是*int64_t`,而不是`uint64_t`.如果有人写了"if(INT64_MIN> 0)...",那么具有错误类型的表达式就无法使用与其一起使用的编译器的正确行为.但是在很多/大多数编译器上,`((long long)-922等)`就行了. (4认同)
  • @abelenky:为什么贵公司提供自己的`<stdint.h>`?它应该由您的编译器或运行时库提供.在任何Linux系统上,它都是由glibc提供的. (3认同)