【问题标题】:Can't Assign 64 Bit Number to 64 Bit Min in C++无法在 C++ 中将 64 位数字分配给 64 位最小值
【发布时间】:2020-10-28 17:17:09
【问题描述】:

我是 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 太大,无法容纳 64 位整数。 - 是应用于数字的运算符,并不意味着将数字解析为负数。此外,如果这是 C++,那么请从 &lt;limits&gt; 中获取 std::numeric_limits&lt;std::uint64_t&gt;::min()
  • @AdrianMole 这根本不是真的。后缀在这里无关紧要。 “整数文字的类型是值可以适合的第一个类型,来自类型列表,这取决于使用了哪个数字基数和哪个整数后缀。”请参阅en.cppreference.com/w/cpp/language/integer_literal。这里最小的这种类型是一个无符号的 64 位整数(我之前应该更清楚地说 64 位 signed 整数)
  • 请看链接下的表格。如果没有后缀,则列出所有整数类型。
  • (请注意,Java 对整数常量有不同的规则 - 如果您有这样的背景,那么您可能会发现 C++ 规则令人惊讶。最重要的是,欢迎使用 C++!)

标签: c++ 64-bit


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    问题在于-9223372036854775808 不是文字。 9223372036854775808 是一个字面量,-9223372036854775808 是一个表达式,由该字面量加上一元 - 组成。

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

    最简单的解决方案是使用&lt;cstdint&gt; 中定义的INT64_MIN 宏。

    除此之外,问题是负值没有文字。另一种解决方案是将-9223372036854775808 替换为-9223372036854775807-1 -- 或(-9223372036854775807-1) 以避免歧义。 (&lt;cstdint&gt; 标头很可能会做类似的事情)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 2010-09-14
      相关资源
      最近更新 更多