Почему вы хотите, чтобы произошло целочисленное переполнение? - PullRequest
25 голосов
/ 03 февраля 2011

В этом вопросе тема состоит в том, как заставить VS проверять арифметическое переполнение в C # и выдавать исключение: C # Переполнение не работает?Как включить проверку переполнения?

В одном из комментариев было сказано что-то странное и за него проголосовали. Надеюсь, вы мне поможете:

Вы также можете использоватьпроверенное ключевое слово, чтобы обернуть оператор или набор операторов, чтобы они были явно проверены на арифметическое переполнение.Установка свойства для всего проекта немного рискованно, потому что часто переполнение - вполне разумное ожидание.

Я не очень разбираюсь в оборудовании, но знаю, что переполнение связано с тем, как работают регистры.Я всегда думал, что переполнение вызывает неопределенное поведение и должно быть предотвращено, где это возможно.(в «обычных» проектах, без написания вредоносного кода)

Зачем вам ожидать, что произойдет переполнение, и почему бы вам не предотвратить его, если бы у вас была такая возможность?(установив соответствующую опцию компилятора)

Ответы [ 13 ]

0 голосов
/ 03 февраля 2011

Вся целочисленная арифметика (хорошо добавляет вычитания и умножает по крайней мере) является точной. Это просто интерпретация полученных битов, с которыми вам нужно быть осторожными. В системе дополнения 2 вы получите правильный результат по модулю 2 с количеством битов. Единственная разница между знаковым и беззнаковым состоит в том, что для знаковых чисел старший значащий бит рассматривается как знаковый бит. Это до программиста, чтобы определить, что подходит. Очевидно, что для некоторых вычислений вы хотите знать о переполнении и предпринять соответствующие действия, если таковые обнаружены. Лично мне никогда не требовалось обнаружение переполнения. Я использую линейный конгруэнтный генератор случайных чисел, который опирается на него, то есть умножение целых чисел без знака на 64 * 64 бита, я забочусь только о младших 64 битах, я получаю операцию по модулю бесплатно из-за усечения.

0 голосов
/ 03 февраля 2011

Целочисленное переполнение выглядит следующим образом.

У вас 8-битное целое число 1111 1111, теперь добавьте к нему 1.0000 0000, начальная 1 усекается, поскольку она будет на 9-й позиции.

Теперь скажите, что у вас целое число со знаком, старший бит означает, что он отрицательный.Итак, теперь у вас есть 0111 1111. Добавьте 1 к нему, и вы получите 1000 0000, что составляет -128.В этом случае добавление от 1 до 127 сделало его переключением на отрицательное значение.

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

0 голосов
/ 03 февраля 2011

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

...