Ошибочное преобразование кардинала в OleVariant.UInt64 в порядке - PullRequest
3 голосов
/ 13 мая 2019
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-разрядное - нет.

1 Ответ

4 голосов
/ 13 мая 2019

Это ошибка Delphi.

Сообщается как RSP-18363 Неверное преобразование кардинала в OleVariant

Описание ошибки:

Неправильное прямое преобразование кардинала в OleVariant.Результат отличается от преобразования кардинала в вариант в олевариант

...