Функция __builtin_add_overflow поддерживается в gcc 5 и выше, и какие функции могут заменить ее в gcc 4.6? - PullRequest
1 голос
/ 06 марта 2019

Я создал простой код апплета, который имеет неподдерживаемую функцию __builtin_add_overflow в моей версии gcc 4.6. Учитывая некоторые причины, я не хочу обновлять свою версию gcc. Итак, какую функцию в моей версии gcc можно использовать для замены этой функции?

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

Обнаружение переполнения зависит от типа ваших переменных.

Если они не подписаны, достаточно определить, является ли результат ниже, чем один из их операндов.

inline unsigned_overflow(unsigned a, unsigned b){
  return (a+b)<a;

Еслиоба являются беззнаковыми, переполнение может произойти, только если операнды имеют один и тот же знак, а знак результата будет другим.Таким образом, существует переполнение, если знак результата отличается от знака его двух операндов.

inline signed_overflow(int a, int b){
  unsigned ua=a, ub=b;
  return (int)(((ua^(ua+ub))&((ub^(ua+ub)))<0  ;
1 голос
/ 06 марта 2019

Вы должны написать это самостоятельно. Если аргументы не подписаны, это не так сложно сделать (просто сравните, если сумма меньше, чем одно из добавлений в более крупном типе ввода). Проверка переполнения для целочисленной арифметики со знаком может быть довольно сложной, особенно если все три целочисленных типа различны. Существует расширение GCC, которое несколько помогает: преобразование неподписанных в подписанные типы не запускает неопределенное поведение, но уменьшает значение в соответствии с арифметикой дополнения до двух. Таким образом, вы можете использовать это:

  unsigned x1 = x1;
  unsigned y1 = y1;
  bool overflow = (int) (((x + y) ^ x) & (x + y) ^ y))) < 0;

В книге Восторг Хакера широко обсуждаются такие темы.

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