Учтите:
uint16_t x;
uint16_t y;
y = 0;
x = y - 1;
X будет каким-то безумным числом. См. Другие статьи SO для «почему» и чтобы узнать о комплименте от 2 .
(Я не спрашиваю, почему это так. Я знаю почему. Я спрашиваю кое-что ещеЧитайте дальше.)
Если вы включите флаг gcc -Wconversion, этот совершенно правильный код C, приведенный выше, выдаст conversion to ‘uint16_t {aka short unsigned int}’ from ‘int’ may alter its value
Это компилятор, пытающийся помочь нам не испортить.И я склонен программировать с включенными такими предупреждениями, потому что они помогают мне избежать путаницы.
Однако существуют реалистичные случаи, когда мы можем использовать unsigned int в качестве счетчика и захотим вычесть 1 и НЕ получить это предупреждение,Кроме того, мы хотим использовать его в качестве счетчика, уменьшить его до нуля, а затем просто остановить.Чтобы сделать это в C, мы должны поставить какую-то проверку.Тем не менее, этот вид контрольного кода будет нарушать предупреждение gcc.
Как и код выше.
Я хочу свой торт и хочу его съесть тоже.
Какое элегантное решение для этого?