Приятная двусмысленность

Ivan8209


$ gforth
Gforth 0.6.2-20060527, Copyright (C) 1995-2006 Free Software Foundation, Inc.
Gforth comes with ABSOLUTELY NO WARRANTY; for details type `license'
Type `bye' to exit
:noname 40 0 do 1 i lshift cr hex u. loop ; execute
1
2
4
8
10
20
40
80
100
200
400
800
1000
2000
4000
8000
10000
20000
40000
80000
100000
200000
400000
800000
1000000
2000000
4000000
8000000
10000000
20000000
40000000
80000000
1
2
4
8
10
20
40
80 ok
decimal 1 32 lshift . 1 ok

Это о том, к чему приводит строгое следование стандарту:
такое определение сдвига влево ломает устоявшуюся практику,
но несмотря на это, всё чётко, всё верно.
Ибо, сказано в Писании (ANS X3.215--1994, 6.1.1805):
"Perform a logical left shift of u bit-places on x1, giving x2.
Put zeroes into the least significant bits vacated by the shift.
An ambiguous condition exists if u is greater than or
equal to the number of bits in a cell." (Курсив мой. --- K.)
И ни к чему не прикопаешься, поскольку поведение системы
полностью удовлетворяет ст. 3.4.4: "ignore and continue."
---
"...Отрубил Иван-царевич 32768 голов --- и умер Змей Горыныч,
потому что был он шестнадцатиразрядным."

kruzer25

"...Отрубил Иван-царевич 32768 голов --- и умер Змей Горыныч,
потому что был он шестнадцатиразрядным."
http://santer.livejournal.com/600.html?mode=reply

davidko

Ну и дизайн, даже непонятно, что на ЖЖ зашёл, а не на какой-нибудь фишки.нет

SPARTAK3959

Это дефолтное поведение ассемблерной команды сдвига - сдвиг берется по модулю 32.

Ivan8209

Хм.
Я раньше не замечал этой особенности.
Спасибо за объяснение, а то мне как-то лень было с этим разбираться.
Вот только непонятно, а на си "<<" тоже "ambiguous"?
---
...Я работаю антинаучным аферистом...
Оставить комментарий
Имя или ник:
Комментарий: