- Код: Выделить всё
- 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?





