奇怪的Delphi整数乘法行为

4

我正在处理一些古老的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

Some genius would be appreciated. Thanks.


8
整数溢出 - Mysticial
应该把这个作为答案发布,因为你帮了我很多,我会投票支持你的。 - NoPyGod
3
在提出问题之前,请先搜索错误信息。您可以在Stack Overflow上提问之前先尝试使用Google搜索您所遇到的错误。这样,您可能会找到此页面,其中解释了该错误。请注意不要改变原意。 - Seth Carnegie
我本来想将这个标记为重复内容,但在SO上搜索“[delphi]“integer overflow””并没有找到令人满意的结果。也许它在这里,但很难找到(而且SO旨在包含有用的答案-即使可以通过Google在其他地方找到)。 - Argalatyr
1
我经常使用谷歌在 Stack Overflow 上查找东西。只需将“site:stackoverflow.com”添加到您的谷歌查询中,即可限制谷歌搜索范围为 Stack Overflow。而且它们非常及时。几分钟前提出的问题会显示在谷歌搜索结果中... - Marjan Venema
3个回答

11

好的,我会把这个变成答案。

错误信息应该很清楚。这里发生了整数溢出:

130245932 * 1103516849

因为 130245932 * 1103516849 = 143728580475708268,这个结果太大了,无法放入32位整数中。


6
这是基于内存在系统中的表示方式。基本上,每个整数只有32位。对于带符号的整数,一个比特用于表示符号;这使您可以获得从负2^31到正2^31(约20亿)的值范围。如果超出该范围,系统将崩溃。
如果需要大整数,请尝试使用Int64而不是integer。如果需要更大的整数,请查看DeHL.中的BigInteger类型。

2

你看到的是整数溢出,我想你可能会好奇具体的结果。

你最初的乘法

(130245932 * 1103516849) = 143728580475708268

...导致了整数溢出,在32位计算中,“环绕”生成了以下结果:

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

…然后你的等式加上了12359:

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

希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接