我正在研究TMemoryStream
类,并发现以下程序:
procedure TMemoryStream.LoadFromStream(Stream: TStream);
var
Count: Longint;
begin
Stream.Position := 0;
Count := Stream.Size; // <-- assigning Int64 to Longint
SetSize(Count);
if Count <> 0 then Stream.ReadBuffer(FMemory^, Count);
end;
我经常看到这种模式,其中Int64被赋值给Longint。
我的理解是,在32位和64位Windows中,
Longint
为4个字节,而Int64
为8个字节,因此如果我的文件大小为$1 FFFF FFFF == 8589934591 == 8 GB
,那么这个程序将无法读取,因为最终的计数将是$ FFFF FFFF == -1
。我不明白为什么允许这样做,也许没有考虑到这一点(也许没有多少人尝试读取一个8+ GB的文件)。
TMemoryStream
为例。但问题适用于任何Int64
和Longint
的组合。未能发现这些差异可能导致意外的生产错误。强类型语言的目的是尝试避免这种情况的发生。适当的编译器警告并非不合理的期望。 - Disillusioned