Начиная с ранних версий Delphi, основные целочисленные процедуры преобразования не только выполняют числовые последовательности, но и некоторые специальные предложения, такие как Паскаль "$ 924" для шестнадцатеричного или C-стиля 0x02).
FreePascal принял его, когда позже начал добавлять совместимость с Delphi (примерно 1997-2003). Помимо этой разницы, другое отличие состоит в том, что последний параметр (RETURN в вашем примере) изменился с WORD (в Turbo Pascal) на integer / longint в Delphi.
IOW, процедура принимает x и думает, что вы хотите преобразовать шестнадцатеричное число в стиле C, а затем интерпретирует «a» согласно таблице Стюарта.
Также интерпретирует% как двоичный код, а & как восьмеричный.
Попробуйте
val('$10',value,return);
writeln(value,' ' ,return); // 16 0
val('&10',value,return);
writeln(value,' ' ,return); // 8 0
val('%10',value,return);
writeln(value,' ' ,return); // 2 0
и сравните результаты.
Обратите внимание, что это, вероятно, не будет работать для очень старых Pascal, таких как Turbo Pascal и Free Pascals, выпущенных до 2000 года.% И & являются специфичными для FPC для соответствия буквенным расширениям обозначений (аналогично $, но для двоичных и восьмеричное)
var x : Integer
begin
x:=%101010; //42
x:=&101; //65