不能将-2147483648分配给long long类型的变量

use*_*325 5 c

我正在编译下面的代码,由于某种原因,我无法将-2147483648分配给8字节长且已签名的变量.

long long x = -2147483648;
Run Code Online (Sandbox Code Playgroud)

当我跨过这一行时,x的值是2147483648,MS Visual Studio中的'Watch'窗口显示x的类型是__int64.sizeof(x)也返回8.

根据limit.h,签署的long long的限制是:

#define LLONG_MAX     9223372036854775807i64       /* maximum signed long long int value */
#define LLONG_MIN   (-9223372036854775807i64 - 1)  /* minimum signed long long int value */
Run Code Online (Sandbox Code Playgroud)

和:

/* minimum signed 64 bit value */
#define _I64_MIN    (-9223372036854775807i64 - 1)
/* maximum signed 64 bit value */
#define _I64_MAX      9223372036854775807i64
Run Code Online (Sandbox Code Playgroud)

我只是不明白!

有人可以对此有所了解吗?

chu*_*ica 4

如果没有 LL,编译器似乎会推断出2147483648是 32 位unsigned long. 然后它应用-运算符。结果是0 - 2147483648。因为它小于 0 并且是一个unsigned long t,4294967296被添加,这2147483648又是。然后将该值赋给long long x

建议:

long long x = -2147483648LL;
// or
long long x = -2147483647  - 1;
Run Code Online (Sandbox Code Playgroud)