program UInt32ToVariant;
uses
Vcl.Dialogs, System.SysUtils, System.Variants;
var
ui32Val: Cardinal;
si64Val: Int64;
ui64Val: UInt64;
v1: Variant;
v2: OleVariant;
sb: TStringBuilder;
begin
sb := TStringBuilder.Create();
try
ui32Val := 4234687430;
si64Val := Int64.MaxValue;
ui64Val := UInt64.MaxValue;
v1 := ui32Val;
v2 := ui32Val;
sb.AppendLine('Unsigned 32 bit integer:'#9 + Cardinal.ToString(ui32Val));
sb.AppendLine(#9'to Variant:'#9 + VarToStr(v1));
sb.AppendLine(#9'to OleVariant:'#9 + VarToStr(v2));
sb.AppendLine();
v1 := si64Val;
v2 := si64Val;
sb.AppendLine('Signed 64 bit integer:'#9 + Int64.ToString(si64Val));
sb.AppendLine(#9'to Variant:'#9 + VarToStr(v1));
sb.AppendLine(#9'to OleVariant:'#9 + VarToStr(v2));
sb.AppendLine();
v1 := ui64Val;
v2 := ui64Val;
sb.AppendLine('Unsigned 64 bit integer:'#9 + UInt64.ToString(ui64Val));
sb.AppendLine(#9'to Variant:'#9 + VarToStr(v1));
sb.AppendLine(#9'to OleVariant:'#9 + VarToStr(v2));
ShowMessage(sb.ToString());
finally
sb.Free();
end;
end.
Результат:
Unsigned 32 bit integer: 4234687430
to Variant: 4234687430
to OleVariant: -60279866 (Wrong!)
Signed 64 bit integer: 9223372036854775807
to Variant: 9223372036854775807
to OleVariant: 9223372036854775807
Unsigned 64 bit integer: 18446744073709551615
to Variant: 18446744073709551615
to OleVariant: 18446744073709551615 (Correct again!)
Это действительно ошибка в Delphi или я что-то не так делаю?
Могу предположить, что OleVariant не поддерживает целые числа без знакаВ общем, 64-разрядное целое число без знака поддерживается, 32-разрядное - нет.