Отлов переполнения при выполнении арифметических операций
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Здравствуйте.
Хочу отловить переполнение при выполнени арифметических операций. Например, есть переменная
x = 0xFF-2
типаunsigned char
. Если мы прибавим к ней 1, переполнения не возникнет, но если прибавим 3, то возникнет переполнение и значениеx
станет равно 0.Единственное, что я придумал, это проверять значение флага процессора
cf
и написал вот такой код:Но есть две проблемы:
intel
, а мне хочется кроссплатформенный способ.Как быть?
Я тут пораскинул мозгами и придумал: а что если в этом виноват
return flag
изget_cf
? По идее,return
этоpushl код возврата
, а в инструкциюpushl
входит%esp + 4
, то есть арифметическая операция, где переполнения не возникает. Может в этом дело?Действительно, решение, как всегда лежало на поверхности :\
P.S.: А разве не наоборот? Должно же быть:
Нет, т.к. оператор постинкремента возвращает значение переменной до выполнения инкремента. А значение
i
в правой части сравнения уже будет увеличенным на единицу. Т.е. порядок операндов в данном случае важен :)Всё понял, спасибо. Пойду дальше велосипеды изобретать :)