Здравствуйте, Евгений Музыченко, Вы писали:
N>>Разумеется, это не натуральное, а целое положительное! ЕМ>Любое целое положительное число является натуральным.
Да, но не в этом случае: тут натуральность — это частный случай. А ожидается именно целое оложительное.
N>>Потому что запись -r не существует в моноиде натуральных чисел. ЕМ>А ей нужно в нем существовать? Зачем?
Потому что код не будет работать без явного каста к целому. Множество натуральных чисел не замкнуто относительно операции вычитания, в нём нет противоположного элемента, поэтому выбирают более подходящее множество. В моём коде беззнаковые только индексы при итерации по контейнерам (из-за STL) и всякие флаги. Ну и внешнее API, если надо. И то не все индексы из-за обратного прохода по циклам и openmp.
ЕМ>Не понял тонкости. Проверять нужно и так и так. А насколько часто Вам требуется, имея r, получить -r, что держать r в беззнаковом типе однозначно выгоднее?
Проверять для знакового надо 1 раз при вводе, а дальше просто пользоваться. Если же будет беззнаковое, то его ещё и кастовать остоянно придётся. По факту ВСЕ оконные координаты в пикслях знаковые, потому что они могут быть отрицательными. Все размеры изображений знаковые, потому что они тоже могут стать отрицательными в результате преобразований — корректных преобразований. И намного проще потом диагностировать почему значение ширины стало -5, а не, скажем, 4294967291. Потому что при -5 оно просто исчезнет или окажется с противоположной стороны. Далее скорости, которые тоже могут измеряться в икселях тоже знаковые. Сдвинули объект, у него окзались отрицательные координаты — обработали. Были бы они беззнаковыми, получилась бы либо лапша проверок в коде, либо завёрнутая внутри методов. И так повсюду.
Оказалось, что беззнаковые нужны за редким исключением, чаще всего для редкого внешнего API, где просто нет вычитания.