【问题标题】:What happens when adding or multiplying an integer exceeds its limit当一个整数相加或相乘超过其限制时会发生什么
【发布时间】:2018-06-09 15:59:37
【问题描述】:

当整数超过其极限时会发生什么?输出是 3595 ,它是怎么来的?它是2字节类型的?

#include<stdio.h>
#include<conio.h>
void main()
{
  int n=12,res=1;
  clrscr();
  while(n>3)
  {
    n+=3;
    res*=3;
  }
  printf("%d",n*res);
  getch();
}

【问题讨论】:

  • 为了自己回答这个问题(你必须这样做,因为未定义的行为,这会阻止一个通用的答案),你应该慷慨地添加对 printf() 的调用。还要打印sizeof(int),以便在您的环境中找到第二个问题的答案。

标签: objective-c c arrays data-structures types


【解决方案1】:

程序将具有未定义的行为。

您给出的条件是非终止的。这是一个循环,条件永远不会以明确定义的方式终止。

你会继续相乘,然后一旦溢出。然后,如果您在n&lt;=3 中得到否定结果,那么它将停止。同时res 也溢出了。因此,您将无法确定该程序的行为方式。我们无法确定结果会是什么。

【讨论】:

  • 是的,我明白了,但是如果我们在编译器中运行这个程序,肯定会得到答案,运行时会发生什么?
  • @Mathan.:是的..这就是正在解释的内容。你永远无法确定。大多数情况下,它会在某个点之后溢出,然后结果将是确定的,但这又取决于架构——它如何处理这样的溢出问题。你永远无法确定。当您检查答案时,也许您的教授机器的行为会与您的机器不同。 :)
【解决方案2】:

行为未定义 - 您不应依赖任何特定的东西。 int溢出的常见表现有:

  1. 环绕,这样1 + INT_MAX 就变成了INT_MIN。这就是我遇到的每台 Windows PC 所做的事情。该操作产生的位模式与unsigned 表亲完全匹配。

  2. 夹紧,使得1 + INT_MAX 变为INT_MAX。我上次在 1990 年代运行 UNIX 变体的机器(有符号幅度 int)上观察到这一点。

【讨论】:

  • 现代编译器可以优化掉n 变量,因为条件始终为真。
  • @willys:虽然我还没有遇到过这样的人,你呢?
猜你喜欢
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 2013-07-09
相关资源
最近更新 更多