【问题标题】:Long integer overflow in C++ [duplicate]C ++中的长整数溢出[重复]
【发布时间】:2017-12-06 01:36:19
【问题描述】:

为什么下面的代码会给出整数溢出警告:

#include <stdio.h>

int main()
{
    long long int x = 100000 * 99999;
    return 0;
}

而以下代码完美运行:

#include <stdio.h>

int main()
{
    long long int x = 100000000000000;
    return 0;
}

【问题讨论】:

  • 你乘以 int 值(不是两个 long long 值)
  • 来自reference for integer literal“整数字面量的类型是该值可以适合的第一个类型” - 所以在这种情况下int
  • 但在任何一种情况下,我都只是分配数字。两种情况下的结果应该相同,因为第一种情况下的乘法结果比第二种情况下的要小。

标签: c++


【解决方案1】:

因为这里

long long int x = 100000 * 99999;

两个 ints 相乘。试试

long long int x = 100000LL * 99999;

【讨论】:

  • 谢谢。我刚刚尝试了 1LL * 100000 * 99999 并且它有效。但是 100000 * 99999 * 1LL 没有用。现在我明白你的意思了。谢谢。
  • @user3243499 确实,因为100000 * 99999 * 1LL 被评估为(100000 * 99999) * 1LL,括号中的表达式是两个ints 的乘积。
  • 到目前为止我的误解是在 C/C++ 中,最终大小将始终等于表达式中的最大大小。
  • @Ron const 在这里应该没有任何区别。
  • @user3243499:事实上,为了记录,整数提升(较小的操作数匹配更宽的操作数,或者两者都匹配更窄的 int)在每个二元运算符的评估期间分别发生,按运算符的顺序优先级。
【解决方案2】:

设置为 100000LL * 99999LL 以使警告消失。

【讨论】:

  • 这个答案可能需要一些关于为什么这样做的解释
【解决方案3】:

您应该阅读thisthis

整型字面量的类型是值的第一个类型 可以适合,从取决于哪个数字基数的类型列表中 以及使用了哪个整数后缀。

(感谢@UnHolySheep 让我注意到它)。 如果您希望编译器以不同的方式解释您的文字,则必须添加一个后缀。例如,对于int,您可以添加LLll 以指定它是long long int。对于无符号数字,后缀为u

对于浮点字面量,情况相同:有一个默认类型,即double,但如果您想要float,您可以轻松使用f(或f)后缀。使用浮点,您甚至可以使用指数表示(使用e)。

【讨论】:

  • “默认情况下,整数文字(常量)的类型为 int” - 不,您自己阅读了第二个链接吗?整数常量或可以容纳它们的第一种类型,在 OP 的情况下恰好是 int。如果数字大到无法容纳在 int 中,则选择下一个更大的类型(如果不能容纳它,则选择下一个更大的类型,等等)
猜你喜欢
  • 2021-03-11
  • 2018-08-21
  • 2020-08-17
  • 2012-10-05
  • 2019-08-23
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
相关资源
最近更新 更多