Comdiv писал(а):
arisu писал(а):
кстати, надо бы добавить в язык встроеную функцию `CLAMP(val, lo, hi)`. очень удобная штука, органично дополняет `MIN` и `MAX`.
И насколько часто эта штука встречается? Если нечасто, то выглядит слишком надуманно в сравнении с кристально понятным MIN(MAX(lo, val), hi), которое можно научить оптимизировать компилятором.
в моих задачах довольно часто, откуда и возникло желание. тут вопрос не столько в оптимизации кода, сколько в том, что `MIN(MAX(…))` всё-таки при чтении надо интерпретировать. ну, или перестать воспринимать как отдельные команды, и приучиться читать как целый глиф — а я не люблю глифы без нужды.
Comdiv писал(а):
Вы как-то слишком сузили контекст. Я не работаю с обратным кодом, но предпочитаю работать с числами на высоком уровне так, чтобы была неважна система кодирования - симметричный диапазон и переполнение как ошибка. Я рассматриваю зависимость от системы кодирования в высокоуровневом коде как ошибку в проектировании.
а здесь у нас классическая задача, у которой нет единственно правильного решения. я приверженец точки зрения, которая говорит не забывать о том, что код в итоге исполняется на вполне конкретном железе с вполне конкретными характеристиками. соответственно, при написании кода важно — в том числе — помнить, сколько бит в целом, как оно представлено «на железе» и прочие подобные штуки. и не бояться использовать это знание если оно действительно надо для оптимизации кода. иначе мы получаем современную сишечку, в которой вполне однозначно отображающиеся в машинный код операции на уровне языка являются UB, и компилятор вынужден делать кучу pattern-matching эквилибристики, чтобы превратить «правильный по стандарту код» обратно в пару машинных команд.
собственно, мой опыт мне показывает, что беззнаковые целые нужны или для связи с внешними библиотеками, или как раз в коде типа хэширования, PRNG, такого вот, где нам на выходе не особо важно, как именно получился результат, а вполне устраивает побитовое отображение. зато в написании такого кода полезно иметь возможность делать беззнаковую математику не прибегая к постоянному преобразованию в LONGINT.
а если всё это ужать, то кратко будет так: я не вижу особой ценности в беззнаковых числах, но если уж без них не обойтись — то не вижу смысла пытаться делать вид, что мы не знаем, как они выглядят на уровне железа, особенно с учётом того, что консенсус в этом достигнут много десятков лет назад. появится другое железо — будем делать другой код, значит: компилятор нам отловит нужные места.