Как проверить, что сумма / умножение / вычитание создает переполнение? - PullRequest
0 голосов
/ 07 июня 2019

Так что я просто пытаюсь сложить два числа вместе,

Первое - P1 = 2147483647, а другое - P2 = 1 Это должно переполнить тип int, поэтому я написал это, чтобы попытаться предотвратить компьютерот переполнения

if((P1 + P2) > sizeof(int)){
    halt = 1; /*halt is just a flag*/
}

Но компьютер, очевидно, все еще пытается сделать сумму, чтобы проверить это, выдавая мне ошибку времени выполнения перед сообщением, которое я написал, в котором просто говорится, что я не могу сложить эти два числа вместе.Как я могу сделать это, не встречаясь с ошибкой во время выполнения и просто отображая мое сообщение?

Я также пытаюсь сделать это для вычитания и умножения, но проблема та же.

РЕДАКТИРОВАТЬ:Мне нужно сделать это для проекта, я не думаю, что смогу использовать ограничения библиотеки. H

Ответы [ 2 ]

2 голосов
/ 07 июня 2019
#include <limits.h>
if (P2 > INT_MAX - P1) {
   printf("Overflow would occur\n");
}

Пояснение:

INT_MAX - P1 - это наибольшее значение, которое вы можете добавить к P1 без переполнения.
Если P2 больше этого значения, оно слишком велико, и произойдет переполнение.


Если вам нужно проверить также и недополнение, математическая идея та же:

if ( -P2 < P1 - INT_MIN) {
    printf("Underflow would occur\n");
} 

Объяснение

(P1 - INT_MIN) - это самое большое * значение, которое можно вычесть из P1 без потери значения. Если -P2 еще более отрицателен, тогда при добавлении произойдет недостаточное значение.

* Наибольший по величине, а не по значению.

1 голос
/ 07 июня 2019

Классический битовый трюк для проверки переполнения заключается в вычислении:

if( (~(p1^p2) & (p1^(p1+p2)) & (1ull<<(8*sizeof(p1)-1)) ){
  printf("overflow in the addition of p1 and p2") ;
}

Идея, что это переполнение может произойти только тогда, когда оба числа имеют один и тот же знак. В этом случае это может доказать, что переполнение будет производить число со знаком, отличным от одного из аргументов. Это то, что проверить функцию.
Поэтому в MSB (последняя часть выражения) проверьте, идентичны ли знаки операндов (первая часть выражения) и отличается ли знак результата от знака операнда 1 (вторая часть выражения).

Для вычитания достаточно удалить битовое дополнение в выражении.

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