Почему это не приводит к ошибке? - PullRequest
0 голосов
/ 04 марта 2019

Я не понимаю, почему это не вызывает ошибку.

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 $ Я думаю, что это такое.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

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
0 голосов
/ 04 марта 2019

Это может дать вам НЕТ ПЕРЕХОДА на двух разных маршрутах:

  1. Ваш компилятор имеет право оптимизировать ваше утверждение if.Так как ничто из типа int не может быть> INT_MAX, оно всегда ложно, поэтому ваш if скомпилирован в простой printf("NO OVERFLOW\n");.
  2. . Для другого вам нужно знать 2-дополнение.Если вы добавите 1 к INT_MAX, он поворачивается и становится наименьшим числом, которое может представлять int.Так что 2147483647+1=-2147483648, что не имеет смысла в математике, но здесь это особенность дизайна.Это позволяет добавлять разумно большие отрицательные числа к положительным числам.Просто вам нужно помнить, чтобы использовать правильный тип для хранения ваших чисел.

(я предполагаю, что «нормальный» 32-битный тип int, но некоторые архитектуры используют другой размер, например, для AVR816 бит.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...