Здравствуйте, eao197, Вы писали:
E>Осталось только доказать, что на момент написания кода с арифметикой тип Signal уже был беззнаковым. Скорее всего, что на тот момент тип Signal был знаковым.
Да, во время написания кода было Signal = int. Цитата из раздела "History":
Rewinding the header file shows that once upon a time we had:
/**
* Typedef used to represent signal quality as a percentage.
* 100 represents perfect signal, 0 no signal.
*/
typedef int Signal;
The code worked just fine back then.
E>А тот, кто изменял тип Singal, скорее всего, даже не знал, какие арифметические операции над ним производятся. Обычная ситуация.
Если бы этот программист знал совет "избегайте беззнаковой арифметики" и следовал ему, то он не поменял бы int на unsigned. И ошибка не возникла бы.
Это большой соблазн: "раз переменная содержит только неотрицательные значения, то пусть будет unsigned". В эту ловушку уже попалось много программистов (включая меня) и, видимо, ещё много попадётся.
E>Так что вывод "избегайте беззнаковой арифметики" в данном случае вполне можно довести до логического завершения: избегайте программирования. Вообще. Ибо крайне подверженное ошибкам занятие.
Волков бояться — в лес не ходить. Но если уж идти в лес (хочется кушать), то разумно максимально обезопасить себя от волков (например, взять оружие или разжечь костёр). C/C++ — очень свободные языки. Чтобы обезопасить себя от ошибок, нужна само-дисциплина. Многие советы/правила программирования на C/C++ — это запреты: "не делайте так-то", "не используйте то-то". Например, многие команды стараются избегать голых указателей в основном коде. Используют обёртки и умные указатели. Так что "избегайте беззнаковой арифметики" не влечёт "избегайте программирования".