无法在 C++ 中将 64 位数字分配给 64 位最小值

Can't Assign 64 Bit Number to 64 Bit Min in C++

我是 C++ 的新手,如果这听起来像是一个愚蠢的问题,我很抱歉。我正在尝试将 64 位最小值 (-9223372036854775808) 分配给 int64_t(来自 cstdint),但是我收到当前错误消息:

main.cpp:5:27: warning: integer literal is too large to be represented in a signed integer type, interpreting as unsigned [-Wimplicitly-unsigned-literal]
int64_t int_64_min = -9223372036854775808;

代码如下:

#include <iostream>
#include <cstdint>

int main() {
    int64_t int_64_min = -9223372036854775808;
    std::cout << int_64_min << std::endl;
    std::cout << INT64_MIN << std::endl;
    return 0;
}

我是不是遗漏了什么明显的东西?

问题是 -9223372036854775808 不是文字。 9223372036854775808 是一个文字,-9223372036854775808 是一个表达式,由该文字和应用的一元 - 组成。

所有无后缀的十进制文字都是 intlong intlong long int 类型。由于 9223372036854775808 是 263,它大于 long long int 的最大值(假设 long long int 是 64 位,几乎可以肯定是)。

最简单的解决方案是使用 <cstdint> 中定义的 INT64_MIN 宏。

除此之外,问题是负值没有文字。另一种解决方案是用 -9223372036854775807-1(-9223372036854775807-1) 替换 -9223372036854775808 以避免歧义。 (<cstdint> header 很可能做了类似的事情)。

这正是 为什么 INT_MIN 宏系列在 2 的补码平台上通常被定义为 -INT_MAX - 1 +20).

在 C++ 中没有负文字这样的东西:只有一个正数的一元否定,它产生一个编译时可计算的常量表达式。

9223372036854775808 太大而无法放入 64 位有符号整数类型,因此否定它并分配给有符号 64 位整数类型的行为是实现定义的。

编写 -9223372036854775807 - 1 可能是您的 C++ 标准库实现所做的。如果我是你,我会直接使用 INT64_MINstd::numeric_limits<std::int64_t>::min().