Re: Откуда эта лютая любовь к знаковым целым?
От: Aleх  
Дата: 07.05.20 00:36
Оценка: +1 -4
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Даже во многих современных программах на C++ часто вижу int/short/long там, где по смыслу должно быть беззнаковое целое. А в ранних программах знаковые целые вообще использовались везде, где было технически возможно. Даже в классической книге Кернигана/Ритчи множество примеров, где счетчики, индексы и прочие имеют знаковый тип. В виндовых SDK, где знаковость в основном используется адекватно, все равно регулярно встречаются знаковые параметры размеров, количеств и прочего, где не используются отрицательные значения для особых случаев.


ЕМ>Откуда такое пристрастие, кроме как от лени? Вроде как сколько-нибудь массовых процессоров, где беззнаковые целые поддерживались бы ограниченно, не существует. Есть в этом хоть какое-то рациональное зерно?


Я против использования знаковых там, где значение беззнаковое. Отчего любовь у людей? От недостатков мышления.

Для того, чтобы доказать, что это именно недостатки мышления, рассмотрим критерии.
1. Любители знаковых индексов обычно используют int там, где диапазона значений int недостаточно (64битная платформа).
2. Пользоваться итераторами не умеют. Попробуйте попросить такого человека написать бинарный поиск. Он его напишет с помощью int, а средний элемент будет вычислять с как (a + b) / 2.
3. В связи с тем, что используются знаковые числа, код кишит мусорными проверками (как условия, так и assert) на неотрицательность числа. Из-за этого код становится запутанным и легко содержит ошибки.
Из-за того, что некоторая функция становится толерантной к тому, что туда передают отрицательный индекс, нарастает куча извращенной логики в других местах.
В случае с беззнаковыми сразу понятно, что значение от 0 до max. Не нужно делать лишних runtime проверок типа assert(index >= 0) или, что ещё хуже if (index < 0) return; Это всё признаки грязного кода.

Я ещё не видел человека, который бы писал ЧИСТЫЙ код и любил бы int.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.