【问题标题】:Adding two positive integers gives negative answer.Why?添加两个正整数给出否定答案。为什么?
【发布时间】:2015-06-19 08:59:10
【问题描述】:
#include<iostream>

using namespace std;

int main(){

  int x = 1967513926;
  int y = 1540383426;

  cout<<x+y;

return 0;
}

以上两个整数之和为 3507897352

【问题讨论】:

  • cout &lt;&lt; std::numeric_limits&lt;int&gt;::max() &lt;&lt; '\n'; 你会发现3507897352 在你的实现中明显大于上述结果。然后考虑有符号和无符号 int 之间的区别。
  • C++ numbers add to a negative 的可能重复项
  • Int 是 32 位的,它是单字节的,所以它的范围是 -2147483648 到 2147483648。
  • 您忘记了在这 32 位中需要 1 位来指示它是负数还是正数,因此您的最大带符号整数是 2^31(至少在大多数系统上)。
  • @czeski int 的大小不一定是 32 位。而 32 位 int 的范围是从 -2147483648 到 2147483647,not 到 2147483648

标签: c++


【解决方案1】:

int 是有符号类型,所以它的maximum 是 2^31 - 1 = 2147483647,而不是 2^32 - 1。所以在这种情况下,您确实会发生溢出。

【讨论】:

  • 我认为你的总和不正确:2^31 - 1 是奇数。
  • 感谢修复。投赞成票! (此外,您断言 int 是 32 位有点调皮:标准没有指定)。
【解决方案2】:

您的程序的行为未定义,因为您正在溢出 int 类型:

C++11 标准的第 5/4 段(关于一般的任何表达):

如果在计算表达式期间,结果不是 数学定义或不在可表示值的范围内 它的类型,行为是未定义的。 [...]

在尝试求和之前检查参数的限制(std::numeric_limits 在这里很有用)。

或者,您可以使用unsigned 类型:溢出这些类型是安全的,因为标准规定一旦达到最大值,它们将回绕到 0。

【讨论】:

    【解决方案3】:

    int 的限制是 2.147.483.647

    你只是在溢出它。

    当你这样做时(在int)2.147.483.647 + 1。这给你 –2147483648。 ;)

    【讨论】:

    • 这是 your 平台上 int 的限制,它是 32 位,但 C 标准只要求它至少为 16 位宽,所以没有条件的说否则会产生误导。
    【解决方案4】:

    迪帕克,

    请检查 int 提供的最大限制,如果您的总和超过它,这将不起作用,您必须增加整数值的长度。

    您可以尝试 numeric_limits,它可以为您带来您正在寻找的最大尺寸。

    希望这会有所帮助!

    干杯!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 2016-04-13
      • 1970-01-01
      相关资源
      最近更新 更多