Как определить 64-разрядное целое число без знака в Delphi7? - PullRequest
10 голосов
/ 17 июня 2011

В Delphi 7 int64 подписываются, и если я пытаюсь объявить шестнадцатеричную константу, превышающую 8000000000000000 (например, что на самом деле является uint64), я получаю сообщение об ошибке. Можете ли вы посоветовать какие-нибудь обходные пути, пожалуйста?

Ответы [ 3 ]

5 голосов
/ 17 июня 2011

Вы можете сделать вариант записи следующим образом:

type muint64 = record
  case boolean of
    true: (i64 : int64);
    false:(lo32, hi32: cardinal);
end;

Теперь вы можете просто использовать кардиналы, чтобы заполнить ваш uint64 неподписанными данными.

Другой вариант - использовать код, подобныйэто:

const almostmaxint64 = $800000045000000; 
var muint64: int64;    
begin
   muint64:= almostmaxint64;
   muint64:= muint64 shl 1;
end
2 голосов
/ 17 июня 2011

Традиционно в реализации Broland возникали проблемы с совместимостью из-за отсутствия самой большой без знака , поддерживаемой целевой платформой. Я помню, что использовал LongInt значения вместо DWORD и ждал неприятностей с самых ранних дней Turbo Pascal для Windows. Тогда было Cardinal счастье, но нет, D4 ввел наибольшее целое число Int64 только в своей подписанной форме. Опять же.

Таким образом, вы можете полагаться только на подписанный фундаментальный тип Int64 и молиться ... подождите, нет, просто используйте Int64Rec typecast для выполнения арифметических операций с наименее и наиболее значимой частью отдельно .

Вернуться к объявлению константы:

const
  foo = $8000004200000001; // this will work because hexadecimal notation is unsigned by its nature
                           // however, declared symbol foo becomes signed Int64 value
                           // attempting to use decimal numeral will result in "Integer constant too large" error
                           // see "True constants" topic in D7 Help for more details

procedure TForm1.FormCreate(Sender: TObject);
begin
  // just to verify
  Caption := IntToHex(foo, SizeOf(Int64) * 2);
end;

К сожалению, другой обходной путь - изменить ваш компилятор. Free Pascal всегда синхронизирует подписанные и неподписанные типы.


Этот фрагмент кода компилирует и выдает правильный результат в Borland Delphi версии 15.0 (a.k.a Delphi 7).

2 голосов
/ 17 июня 2011

Без поддержки компилятора у вас не так много опций.

Я предполагаю, что вы хотите передать значение функции в какой-то внешней DLL.Вы должны будете объявить параметр как 64-разрядное целое число со знаком, Int64.Затем все, что вы можете сделать, это передать значение со знаком, которое имеет тот же битовый шаблон, что и требуемое значение без знака.Создайте небольшой инструмент для конвертации с компилятором, который поддерживает 64-разрядные целые числа без знака.

...