Расчеты с QWord в FreePascal

Время от времени мне приходится иметь дело с большими числами в моем приложении. Поэтому я решил использовать QWord, чтобы убедиться, что диапазон будет (надеюсь) охватывать все сценарии. Короче говоря, кажется, что компилятор FreePascal выполняет все математические операции в диапазоне целых чисел. Это приводит к некоторому странному поведению, т.е.

if QWordVariable > 8600000000 then ...

не входит в секцию then, даже если переменная QWordVariable больше 8600000000. Только диалог явного типа позволяет предложению if работать правильно:

if QWordVariable > QWord(8600000000) then ...

У кого-нибудь есть идея, почему компилятор автоматически не конвертирует статическое число в QWord для сравнения?

Заранее большое спасибо и с уважением,

LT


person LordTiberius    schedule 20.05.2015    source источник


Ответы (1)


Беззнаковый тип наивысшей точности является особенным, потому что Паскаль использует знаковый тип как базовый и выполняет вычисления в самом высоком общем базовом (знаковом) типе. Литералы также по умолчанию относятся к этому типу.

Поскольку этот высший тип — int64, диапазон выражений с qword и литералами превышает 64-битный. (-2 ^-n .. -2^(n+1)-1 при n=63)

См. также Почему Delphi и Free Pascal обычно предпочитают целочисленный тип данных со знаком беззнаковому?

Я бы просто использовал int64, пока вам действительно не понадобится этот дополнительный бит.

person Marco van de Voort    schedule 20.05.2015
comment
Большое спасибо! Кажется, мне действительно нужен беззнаковый тип данных (хотя в моем примере это не показано). Так что я должен следить за этим особым случаем. - person LordTiberius; 20.05.2015