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啊
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