Пока что тут не прозвучало слов в защиту или опровержение операций сдвига в противоположную сторону при заданном отрицательном количестве бит.
Скажите навскидку: ORD({31}) < 0 или нет? Оно всегда и везде < 0 или в специфическом окружении так может и не быть? Где в описании языка про это есть? Другими словами, всегда ли при программировании на Обероне-07 нам следует ассоциировать 31-й бит как знаковый? Когда к целым числам применяется официально не системная, но одобренная и предсказуемая операция ROR, об этом следует твёрдо знать.
Илья Ермаков писал(а):
ORD как порядковый номер часто полезен для какого-то уникального целого отпечатка другой сущности.
Ну если так, то да, смысл есть. Но такую возможность нужно ещё протащить в стандарт языка, обосновать, хорошо описать в документации, а только потом реализовывать. А пока обойдёмся SYSTEM.ADR, который без SYSTEM.PUT не опаснее ORD.
Kemet писал(а):
Поэтому Вирт посчитал, что наличие двух разных операторов, выполняющих одно и тоже, совершенно излишняя сложность.
Да даже наличие операции ASR — излишняя сложность, потому что то же самое делает DIV, о чём ранее писал Пётр:
Пётр Кушнир писал(а):
Вирт это дело очень любит, умножил/поделил на 01000H вот и сдвинул туда/сюда.
Kemet писал(а):
Беззнаковых типов у Вирта нет, поэтому наличие логического сдвига вправо - лишняя сущность
А вот в логическом сдвиге вправо смысла было бы намного больше, чем в арифметическом (который и без ASR легко сделать с помощью DIV). А так приходится его эмулировать при помощи арифметического сдвига — проверять и сбрасывать знак, и потом только сдвигать.
Kemet писал(а):
Я же говорю - это узко заточенный язык, под конкретное применение. По сюжету он не нужен.
Да я постоянно спорю об этом с Оберонцами-07, но они очень упёртые и этого не признают. Расширяют потихоньку для себя, куда считают нужным.
Kemet писал(а):
А разве есть операция сдвига множества?
В Обероне, насколько я понимаю, на тип SET положена роль работы с битами, а раз так, то смысл в сдвигах битов есть. Просто в отдельную операцию его не выделили, обходятся такой конструкцией:
Код:
set := SYSTEM.VAL(SET, ROR(ORD(set), n));