无法在 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
是一个表达式,由该文字和应用的一元 -
组成。
所有无后缀的十进制文字都是 int
、long int
或 long 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_MIN
或 std::numeric_limits<std::int64_t>::min()
.
我是 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
是一个表达式,由该文字和应用的一元 -
组成。
所有无后缀的十进制文字都是 int
、long int
或 long 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_MIN
或 std::numeric_limits<std::int64_t>::min()
.