как правильно отлавливать переполнения численных типов?
i > UINT_MAX - 10?
Иопт. Всё гениальное просто.
i1 = i + 10;
if (i1 < i) { /* overflow */ }
i=i1;
Только писать с учётом возможности переполнения.
(На самом деле --- задрало. Лисп --- рулит.)
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
Ну это означает уклониться от проблемы, а не решить её. Кроме того, в ряде случаев такое решение неприемлемо.
Это неправильный подход. Насколько я помню, стандартом не описывается как происходит overflow. Поэтому проверка i1 < i - это архитектурозависимо.
В жопу такой стандарт, на нём тогда точно ничего не написать по-нормальному.
Другое дело что я не знаю ни одной архитектуры где overflow происходит не таким образом... Но это еще ни о чем не говорит.
А другого стандарта, судя по всему, нет.
---
...Я работаю антинаучным аферистом...
Медленно, конечно.
Вообще, эта задача очень машинозависима.
Либо ты извращаешься и пишешь так, чтобы никогда не доползать до пределов.
---
...Я работаю антинаучным аферистом...
Оптимизировать должен оптимизатор.
Можно отыскать процессор, где отлавливать переполнение
невозможно вообще.
---
...Я работаю антинаучным аферистом...
Кому должен?
> Можно отыскать процессор, где отлавливать переполнение
> невозможно вообще.
Искать, чтоб выкинуть обратно в помойку? А зачем?
И как же ты предлагаешь соптимизировать операцию сравнения + возможный прыжок после каждой арифметической операции? Ню-ню.
В ядре Linux на 32-битных архитектурах счётчик принятых и полученных байт 32-битный.
Очень неудобно, часто переполняется (примерно 30 секунд при скорости 1Гбит/с).
Если хочешь ну хотя бы график загрузки нарисовать, то нужно
1) часто опрашивать счётчик
2) делать таки сабж
Почему не введут хотя бы 64-битный счётчик?
Правильный ответ - после получения ваших вариантов.
PS: я в этом не копенгаген, прошу ногами не пинать
При скорости 10Гбит/c - уже через 3 секунды переполнение будет
> that it hasn't already been done is that 64-bit
> arithmetic on a 32-bit processor requires using a lock
> to make it atomic, and that's expensive.
Ну да, это основная причина.
Ответ правильный.
или как оно там ещё может называться вручную.
Си --- это тебе не PL.
---
...Я работаю антинаучным аферистом...
i1 = i + 10;Вообще да. Имхо это на любой архитектуре сработает корректно. Ну то есть overflow == переход за максимально допустимое значение, если инты образуют простое кольцо (не в математическом смысле, наверное) по операции ++, то такой проверки достаточно. Всегда достаточно, замечу, нету такого положительного числа, чтобы overflow произошёл два раза. Наверное если подумать, то можно написать проверку на оба переполнения (и вверх и вниз) для a + b и произвольных а, b.
if (i1 < i) { /* overflow */ }
i=i1;
По поводу железной проверки - вы чо, ваще? В х86 есть два прекрасных флага - OV и CF, которые прекрасно описывают все переходы через разные важные границы как для signed, так и unsigned сложения/вычитания.
> так и unsigned сложения/вычитания.
Какой компилятор C умеет их использовать для проверки переполнения?
Ну вообще, насколько я помню, их можно откуда то узнать и использовать самостоятельно.
ассемблерной вставкой типа?
говнопредложение
Ну вообще да, конечно. Тем не менее если скорость не так важна, пиши проверку if ( a + increment < a которая сработает корректно на любой архитектуре вообще.
ассемблерной вставкой типа?А чем тебя смущают ассемблерные вставки, тем более в таком говнослучае?
говнопредложение
---
...Я работаю антинаучным аферистом...
а Си должен рулить - ему по статусу положено.
в K[A-D]11 арифметика была дополнительная до двух.
---
...Я работаю антинаучным аферистом...
но ещё и нестандартные особенности гнутого диалекта.
---
...Я работаю антинаучным аферистом...
Оммм. А если со встроенным range-checking и кидает какой-нить ран-еррор при переполнении (как в паскале)?
исполнения не предусмотренных языком.
---
...Я работаю антинаучным аферистом...
Хотя я стандарт С не читал, и не могу с уверенностью сказать, что там не заявляено в явном виде, что сложение - оно без насыщения.
Оставить комментарий
sergey_m
Вот эта программа ничего не пишет, как и следовало ожидать.Вопрос: а как же правильно сделать эту проверку?