Re[3]: Беззнаковая арифметика
От: Аноним  
Дата: 15.10.06 17:36
Оценка:
Здравствуйте, 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++ — это запреты: "не делайте так-то", "не используйте то-то". Например, многие команды стараются избегать голых указателей в основном коде. Используют обёртки и умные указатели. Так что "избегайте беззнаковой арифметики" не влечёт "избегайте программирования".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.