我是 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)
我错过了一些明显的东西吗?
这正是为什么INT_MIN宏系列通常像-INT_MAX - 1在 2 的补码平台上一样定义的原因(C++20 中几乎无处不在并且是强制性的)。
C++ 中没有负字面量这样的东西:只是正数的一元否定产生编译时可评估的常量表达式。
9223372036854775808 太大而无法放入 64 位有符号整数类型,因此否定它并分配给有符号 64 位整数类型的行为是实现定义的。
编写-9223372036854775807 - 1可能是您的 C++ 标准库实现所做的。如果我是你,我会INT64_MIN直接使用或std::numeric_limits<std::int64_t>::min()。