- Код: Выделить всё
function One: Int32;
begin
One := 1;
end;
var
U: UInt64;
begin
U := One shl 63;
Writeln(BinStr(U, 64));
end.
Компилируется без варнингов, результат на i386:
- Код: Выделить всё
1111111111111111111111111111111110000000000000000000000000000000
Результат на ARMv6:
- Код: Выделить всё
1111111111111111111111111111111110000000000000000000000000000000
Если включить RANGECHECKS, то код выше падает в ран-тайме, но вот если заменить 63 на 62, то почему-то выполняется и тоже выдаёт удивительный результат:
- Код: Выделить всё
0000000000000000000000000000000001000000000000000000000000000000
Я вот как-то слышал такое, что паскаль -- это строгий типизированный язык для людей, с понятными и естественными операторами, без мутных неявных преобразований. Наверное, что я что-то не понимаю в том, как происходит сдвиг битов? Может ли мне кто-нибудь рассказать как в fpc в точности работает shl?