Странное Delphi целочисленное умножение - PullRequest
4 голосов
/ 16 декабря 2011

Я работаю над древним кодом Delphi и наткнулся на что-то, чего я не совсем понимаю.

[bla is set to 130245932]

outresult := ((bla * 1103516849) + 12359);

[outresult is equal to -413953101]

Как умножение двух положительных чисел приводит к отрицательному числу? И почему, когда я беру переменную bla из уравнения и просто использую целое число напрямую (как это)

outresult := ((130245932 * 1103516849) + 12359);

Я получаю сообщение об ошибке еще до того, как приложение скомпилируется

[DCC Error] Unit1.pas(60): E2099 Overflow in conversion or arithmetic operation

Некоторый гений был бы признателен. Благодаря.

Ответы [ 3 ]

11 голосов
/ 16 декабря 2011

Хорошо, я сделаю это ответом.

Сообщение об ошибке должно быть довольно четким. У вас здесь целочисленное переполнение:

130245932 * 1103516849

потому что 130245932 * 1103516849 = 143728580475708268 слишком велик, чтобы поместиться в 32-разрядное целое число.

6 голосов
/ 16 декабря 2011

Это основано на представлении памяти в вашей системе. По сути, у вас есть только 32 бита на целое число. Для целого числа со знаком для знака используется один бит; это дает вам диапазон значений от отрицательного до положительного 2 ^ 31 (приблизительно 2 миллиарда). Если вы выйдете за пределы этого диапазона, система выйдет из строя.

Если вам нужны большие целые числа, попробуйте использовать Int64 вместо integer. Если вам нужно больше целых чисел, проверьте тип BigInteger в DeHL.

2 голосов
/ 16 декабря 2011

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

Ваше начальное умножение

(130245932 * 1103516849) = 143728580475708268

... приводит к переполнению целых чисел, а в 32-битной математике результирующее "циклическое изменение" генерирует:

(143728580475708268 мод 2 ^ 32) - 2 ^ 32 = -413965460

... а затем ваше уравнение добавляет 12359:

-413965460 + 12359 = -413953101 (результат, который вы увидели, Q.E.D. )

Надеюсь, это поможет

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