dephi编程_高手帮帮忙

来源:百度知道 编辑:UC知道 时间:2024/06/21 23:11:54
代码如下
procedure TForm1.Button2Click(Sender: TObject);
var
a:longint;
begin
a:=268435456 * 8;
form1.Caption:=inttostr(a);
end;

运行出错:[Error] Unit1.pas(48): Overflow in conversion or arithmetic operation

当 a:=268435456 * 7; 则能正常运行 这是怎么回事 longint足够大不会益出的啊~~~
268435456*8=(1000|0000|0000|0000|0000|0000|0000|0000)2 一共32位 用longint应该是 (0000|0000|0000|0000|0000|0000|0000|0000|1000|0000|0000|0000|0000|0000|0000|0000 )2 64位 符号位是0啊

268435456 * 8 = 16进制(8000|0000)

8000|0000 16进制

1000|0000|0000|0000 2进制前32位(4个字节)

268435456 * 7 = 16进制(7000|0000)

7000|0000 16进制

0111|0000|0000|0000 2进制前32位(4个字节)

longint类型占内存64位,也就是8个字节

那么最前面一位表示正负号,那么268435456 * 7正好前面的0表示正数,所以没有溢处
268435456 * 8 而这个呢,最高位变成1也就是负数了,所以无法表示你要表达的正数,所以溢出。

除非你用无符号64位整数就能正确计算268435456 * 8这个结果。

因为我对Delphi不太懂,不知道有没有这种类型。

longint 最大正数表示范围

01111111111111111111111111111111 2进制

7FFFFFFF 16进制

2147483647 10进制

而268435456*8=2147483648刚好超过2147483647 所以溢出

##################

我刚才网上查了一下,最大只有int64,没有无符号64位整数。

所以要计算那个值,必须分段计算,用结果用字符串保存显示。

随便下载高精度计算器的源代码,看看原理照着写一个。

转换或算术操作溢出
你把LongInt换成
LongWord