Здравствуйте, Пётр Седов, Вы писали:
ПС>Потом кто-то решил заменить int на unsigned ("someone decided that an unsigned was more appropriate for a value in the range [0, 100]"):
ПС>ПС>
ПС> /**
ПС> * Typedef used to represent signal quality as a percentage.
ПС> * 100 represents perfect signal, 0 no signal.
ПС> */
ПС> typedef unsigned Signal;
ПС>
ПС>Ну и получили ошибку: "So, 10u — 20 is a very big unsigned number." Автор (Thomas Guest) делает из этого четрые вывода ("lessons learned"), но не делает главного: избегайте беззнаковой арифметики.
Осталось только доказать, что на момент написания кода с арифметикой тип Signal уже был беззнаковым. Скорее всего, что на тот момент тип Signal был знаковым. А тот, кто изменял тип Singal, скорее всего, даже не знал, какие арифметические операции над ним производятся. Обычная ситуация.
Так что вывод "избегайте беззнаковой арифметики" в данном случае вполне можно довести до логического завершения: избегайте программирования. Вообще. Ибо крайне подверженное ошибкам занятие.