奇怪的Delphi整数乘法行为

奇怪的Delphi整数乘法行为,delphi,math,Delphi,Math,我正在研究一些古老的Delphi代码,我遇到了一些我不太理解的东西 [bla is set to 130245932] outresult := ((bla * 1103516849) + 12359); [outresult is equal to -413953101] 两个正数相乘如何得到一个负数?为什么我把bla变量从方程中取出来,直接使用整数(像这样) 在应用程序编译之前,我收到一个错误 [DCC Error] Unit1.pas(60): E2099 Overflow in c

我正在研究一些古老的Delphi代码,我遇到了一些我不太理解的东西

[bla is set to 130245932]

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

[outresult is equal to -413953101]
两个正数相乘如何得到一个负数?为什么我把bla变量从方程中取出来,直接使用整数(像这样)

在应用程序编译之前,我收到一个错误

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

一些天才会被欣赏的。谢谢。

这取决于系统中内存的表示方式。基本上,每个整数只有32位。对于有符号整数,符号使用一位;这将为您提供一个从负到正2^31(约20亿)的值范围。如果超出该范围,系统将崩溃


如果需要大整数,请尝试使用
Int64
而不是
integer
。如果您需要大于此值的整数,请查看键入的
biginger
好的,我会给出答案

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

130245932 * 1103516849

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

您看到一个整数溢出,我想您可能对看到的具体结果感到好奇

你最初的乘法运算

(130245932*1103516849)=143728580475708268

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

(1437858047708268模2^32)-2^32=-413965460

…然后你的方程加上12359:

-413965460+12359=-413953101(您看到的结果,)


希望这有帮助

Google:“整数溢出”应该作为aswer发布,因为我会给你投票,你帮了我很大的忙。你可以查一下这个错误。在提出问题之前,请用谷歌搜索你所遇到的错误。我本来打算把它标记为一个副本,但是搜索“[delphi]”“整数溢出”并没有得到任何令人满意的结果。也许它就在这里,但不容易找到(因此它意味着包含有用的答案——即使它们可以通过谷歌在其他地方找到),我总是使用谷歌来查找SO上的内容。只需将
site:stackoverflow.com
添加到您的谷歌查询中,即可将谷歌限制为stackoverflow。而且它们是最新的。几分钟前提出的问题会出现在谷歌搜索中。。。
130245932 * 1103516849