为什么这不会产生错误?

时间:2019-03-04 02:39:19

标签: c

我对为什么这不会导致错误感到困惑。

void f(int I) { 
  ++I;
  if (I > INT_MAX) {
    printf("OVERFLOW\n");
  } else {
    printf("NO OVERFLOW\n");
  }
}

int main(void) {
  f(INT_MAX);
  printf("DONE\n");
}

我正在用C语言编写代码,而我的学校已经将INT_MAX定义为 $ 2 ^ {31}-1 $ ,我想它是什么。< / p>

2 个答案:

答案 0 :(得分:1)

这可以使您在两条不同的路线上不会出现过流量:

  1. 您的编译器有权优化您的if语句。由于int类型的任何内容都不能> INT_MAX,因此始终为false,因此您的if被编译为简单的printf("NO OVERFLOW\n");
  2. 对于另一个,您需要知道2补码。如果将1加到INT_MAX,它会转过来,并成为int可以表示的最小数字。因此,2147483647+1=-2147483648在数学上没有意义,但这是设计功能。这使得在正数上添加较大的负数效果很好。只是您需要记住使用正确的类型来保存您的数字。

(我假设一个“正常的” 32位整数,但是某些架构使用不同的大小,例如,在AVR8整数上,其长度为16位。)

答案 1 :(得分:1)

OVERFLOW在您的情况下将不会打印。您遇到的情况是:当您的I已经达到最大值时,如果您使用++I进一步增加它,它将回绕到最小值。插图:

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>

void f(int I) {
  ++I;
  printf("\nAfter incrementing I: %d\n", I);
  if (I > INT_MAX) {
    printf("OVERFLOW\n");
  } else {
    printf("NO OVERFLOW\n");
  }
}

int main(void) {
  f(INT_MAX);
  printf("DONE\n");
}

输出:

After incrementing I: -2147483648
NO OVERFLOW
DONE