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

19U*_*9UV 4 c++ 64-bit

我是 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;
Run Code Online (Sandbox Code Playgroud)

代码如下:

#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;
}
Run Code Online (Sandbox Code Playgroud)

我错过了一些明显的东西吗?

Bat*_*eba 5

正是为什么INT_MIN宏系列通常像-INT_MAX - 1在 2 的补码平台上一样定义的原因(C++20 中几乎无处不在并且是强制性的)。

C++ 中没有负字面量这样的东西:只是正数的一元否定产生编译时可评估的常量表达式。

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

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