Переполнение без знака Int - PullRequest
17 голосов
/ 08 февраля 2012

Что будет содержать unsigned int при переполнении?Чтобы быть точным, я хочу сделать умножение с двумя unsigned int с: что будет в unsigned int после того, как умножение закончено?

unsigned int someint = 253473829*13482018273;

Ответы [ 3 ]

24 голосов
/ 08 февраля 2012

unsigned числа не могут переполняться, но вместо этого оборачиваются, используя свойства по модулю.

Например, когда unsigned int равен 32 битам, результат будет: (a * b) mod 2^32.


Как указал Чарльз Бэйли, 253473829*13482018273 может использовать умножение со знаком перед преобразованием, поэтому вы должны быть явно указаны unsigned перед умножением:

unsigned int someint = 253473829U * 13482018273U;
6 голосов
/ 08 февраля 2012

Целочисленное переполнение без знака, в отличие от его подписанного аналога, демонстрирует четко определенное поведение.

Значения в основном "переворачиваются".Это безопасно и обычно используется для обратного отсчета или хеширования / мод-функций.

0 голосов
/ 08 февраля 2012

Возможно, это немного зависит от вашего компилятора.У меня были ошибки, подобные этим много лет назад, и иногда вы получали ошибку во время выполнения, в других случаях она в основном «возвращалась» обратно к действительно небольшому числу, которое было бы результатом отсечки битов высшего уровня и оставления остатка, то есть, если это 32бит unsigned int, и результатом вашего умножения будет 34-битное число, оно отрубит 2 старших разряда и даст вам остаток.Возможно, вам придется попробовать его на своем компиляторе, чтобы увидеть, что именно вы получите, что может отличаться от того, что вы получите с другим компилятором, особенно если переполнение происходит в середине выражения, где конечный результат находится в пределахдиапазон без знака int.

...