奇怪的Delphi整数乘法行为
我正在研究一些古老的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
[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