Проверьте, есть ли у переменной размера слова перенос после арифметической операции - PullRequest
0 голосов
/ 28 июля 2010

Может ли большинство компиляторов проверить, не привела ли операция добавления, которая была выполнена ранее в коде, к переносу?

Например:

unsigned int n = 0xFFFFFFFF; // 8 F's
// doing some stuff here ... 
n = n + 1;
// doing some stuff here, without changing the value of @var n
if (n > UINT_MAX) {
  // n has a carry
}

Ответы [ 3 ]

4 голосов
/ 28 июля 2010

Обычно в Си способ определить, произошло ли переполнение (по крайней мере, для беззнаковых целых), если результат сложения меньше, чем любой из операндов.Это будет указывать на переполнение.Насколько мне известно, нет никаких исключений или уведомлений о переполнении.

быстрый поиск в Google:

http://www.fefe.de/intof.html

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

2 голосов
/ 28 июля 2010

В вашем примере беззнаковые целые числа обернутся около 0 (при условии, что ваша реализация c использует 32-битные целые числа без знака).Компилятор не может сказать, если они обернутся, вам нужно проверить свой результат, чтобы увидеть.

if (n > n + 1) { /* wrap around */ }
2 голосов
/ 28 июля 2010

Это условие времени выполнения, поэтому оно не входит в домен компилятора. Фактически состояние ЦП операции переноса будет потеряно при следующей инструкции, которая влияет на флаги.

Вам необходимо обнаружить такие переполнения в программном коде.

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