Традиционно в реализации 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).