我正在编译下面的代码,由于某种原因,我无法将-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)
我只是不明白!
有人可以对此有所了解吗?
如果没有 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)