Int64类型怪事,请帮忙看看!(100分)

  • 主题发起人 主题发起人 xuhao1
  • 开始时间 开始时间
X

xuhao1

Unregistered / Unconfirmed
GUEST, unregistred user!
var i:Int64;
begin
i:=123456789 * 512
//提示超出范围,不可能Int64有19位。
end;

而 i:=123456789 * 5120000000
//确能运行
 
哈哈,就是.怎么回事呢?

i:=123456789 * 5120;
i:=123456789 * 51200;
i:=123456789 * 512000;等都不行

i:=123456789 * 51200000000
//确能运行
i:=123456789 * 5120000000
//确能运行

[:(]
 
靠,还真有这样的事情,我测试的结果是:

i:=123456789 * 1;

i:=123456789 * 17;
都没问题,但是从

i:=123456789 * 18;

i:=123456789 * 5120000;
i:=123456789 * 51200000;
i:=123456789 * 512000000;
都编译不通过(更多的也没法再试了),
[Error] FrmSelLayer.pas(207): Overflow in conversion or arithmetic operation
太奇怪了。
 
我发现i:=123456789 * 5;后面一位可以,10,11位可以,其它好像都不行
 
不是啊,1到17都可以,这……这……我无语,从来没发现竟有这样的问题。

晕啊晕的,我今天是不是喝多了[^],en,must be……
 
哈哈,这个问题都被你们发明了,真高!
有意思哦。
 
难道没有解决办法吗?
是不是编译器的问题
 
应该不好解决吧,我想会不会是bug
 
1.>var i:Int64;
begin
i:=123456789 * int64(512)
//提示超出范围,不可能Int64有19位。
end;
2.
var
I1, I2: Int64;
begin
I2:=512;
I1:=123456789*I2;
end;
编译器试图先将I1的结果值设为Int 型这时候出错了:)
 
123456789 * Int64(512),问题解决,但是不知道为什么,奇怪,应该是Delphi的问题。
 
我觉得lb_icesea79的解释'编译器试图先将I1的结果值设为Int 型这时候出错了'
不能让人信服.
 
我想我知道原因了,123456789 和 512都是integer,32位的,运算时编译器见它们是同类型的,就把它们的值按integer计算,就溢出了,123456789 * 17正好还在integer存储范围内,而123456789 * 18就超出了,而5120000000已超出integer的最大值,已经是int64了,在运算中,根据自动向高类型转换的原则,123456789 * 5120000000中的123456789被转换为int64,其结果也被保存到int64的存储空间中,就不会出错了。

不知道是不是,编译器的问题,像下面的代码就不出错,而byte(90)*byte(100)显然已经超出了byte的存储范围,
var
ss:integer;
begin
ss:=byte(90)*byte(100);
而在
var i:Int64;
begin
i:=123456789 * 512;
end;
中,虽然i是int64,但123456789 * 512的运算结果编译器显然没有把它存到int64应有的空间中。
 
var i:Int64;
begin
i:=Int64(123456789) * Int64(512);
end;
 
可能编译器对于整形运算都是转换成32位进行的,在
var
ss:integer;
begin
ss:=byte(90)*byte(100);
中编译器并没有因为byte(90)*byte(100)都是byte型的就把运算结果按byte处理,而是做了int32处理,而i:=123456789 * 512;也是一样处理全当是32位,根本不管 i 已经是64位了,这样一来自然就认为溢出了,这时只要随便提示一下编译器i:=Int64(123456789) * 512;或i:=123456789 * Int64(512);或i:=Int64(123456789) * Int64(512);都可以避免这个错误。
 
参考了帮助.觉得dirk的说法应该是正确的,
 
感谢各位!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
738
import
I
后退
顶部