【问题标题】:Adding long numbers gives me minus result? [duplicate]添加长数字会给我减去结果? [复制]
【发布时间】:2014-04-10 12:42:11
【问题描述】:

当我尝试添加两个长数字时,它会给我减去结果:

#include<iostream>
using namespace std;
int main ()
{
 int a=1825228665;
 int b=1452556585;
 cout<<a+b;
 return 0;
}

这给了我:

-1017182046

【问题讨论】:

  • 你试过用unsigned int代替吗?
  • 整数溢出,超过整数的最大值(特定于您的编译器/操作系统)
  • 整数常量对于“long”类型来说太大了
  • @PanagiotisKanavos 无符号整数可以正常工作。结果约为 32 亿,完全在无符号 32 位整数的范围内。
  • @JoachimPileborg 我不认为这个问题与特定值有关。 ints 很小,很容易出现溢出错误。此外,int 不保证是 32 位的。该标准规定了最小尺寸:int 为 16 位,long 为 32 位

标签: c++


【解决方案1】:

类型溢出。当您添加两个无法以所选类型存储结果的大数字时,它会被过度使用。在大多数情况下,它会包装数字,但标准中没有定义。所以在某些编译器中,结果是未定义的。

对于 int 和其他数值类型,当程序无法在其中存储这么大的数字时,我们可以看到它的溢出。

假设 int 可以存储从 -10 到 10 的数字,当您这样做时:

int a = 10;
int b = a+1;

您将在b 中得到 -10 或一些随机值(可以是任何值,因为结果未定义)

【讨论】:

  • 我试过它给11。
  • 重新声明您的第一条语句:当算术运算产生无法在类型中表示的值时,行为未定义。大多数实现都会包装,但根本不需要。
  • 好的,James Kanze,谢谢。你是对的
  • @Himanshu 那是因为你的int 可能不仅仅可以存储[-10, 10]
【解决方案2】:

那是因为结果溢出。由于数字有符号数据类型中的第一位用于符号表示。具体表示称为二进制补码 (Wikipedia article here)。实际上,该位中的 1 映射到 - 而 0 映射到 +。这个问题的解决方案是使用更大的数据类型,比如 long。越大意味着用于存储它的内存越大,因此值的范围也越大。

【讨论】:

  • 我用了很长时间但也没有用,我怎样才能将变量声明为 ULL?我试过 unsigned long long int a 但它没有用。
  • 请作为不同的问题提出
猜你喜欢
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 2011-01-04
  • 2021-12-08
相关资源
最近更新 更多