奇怪的Delphi整数乘法行为

时间:2011-12-16 00:21:20

标签: delphi math

我正在研究一些古老的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 个答案:

答案 0 :(得分:11)

好的,我会回答这个问题。

错误信息应该非常清楚。这里有一个整数溢出:

130245932 * 1103516849

因为130245932 * 1103516849 = 143728580475708268太大而无法容纳32位整数。

答案 1 :(得分:6)

它基于内存在系统内部的表示方式。基本上,每个整数只有32位。对于有符号整数,一位用于符号;这给你的值范围从负到正2 ^ 31(约20亿)。如果超出该范围,系统就会崩溃。

如果您需要大整数,请尝试使用Int64代替integer。如果您需要更大的整数,请查看DeHL.

中的BigInteger类型

答案 2 :(得分:2)

你看到一个整数溢出,我认为你可能对你看到的具体结果感到好奇。

您的初始乘法

(130245932 * 1103516849)= 143728580475708268

...导致整数溢出,并且在32位数学中,生成的“环绕”生成:

(143728580475708268 mod 2 ^ 32) - 2 ^ 32 = -413965460

...然后你的等式增加了12359:

-413965460 + 12359 = -413953101 (您看到的结果Q.E.D.

希望这有帮助