Почему этот код для увеличения uint8_t включает `& 0xFF`?

При чтении некоторых примеров кодов для DMA из Xilinx я наткнулся на этот фрагмент кода:

value = (value + 1) & 0xFF

где значение - uint8_t.

В чем смысл & 0xFF? Почему бы просто не написать value = value + 1?

Ответы

Ответ 1

Я предполагаю, что этот код должен работать корректно, даже если value не является 1-байтным (8-разрядным) типом. Битовая маска 0xFF обеспечивает сохранение только последнего байта значения.

Ответ 2

Этот тип кода распространен, когда вы хотите избежать проблем с неявным типом продвижения, или когда вы просто хотите продемонстрировать, что вы рассматривали неявные рекламные акции, когда вы написали код, который является хорошей практикой программирования.

uint8_t - это малый целочисленный тип и поэтому всегда поддерживается до int всякий раз, когда вы используете его в выражении. Результат (value + 1) всегда int.

Без маскировки некоторые компиляторы выдают предупреждения, такие как "попытка сохранить int в uint8_t". Я встречал такие предупреждения на нескольких компиляторах. Теоретически int & 0xFF по-прежнему является int, но поскольку он не может иметь значение больше 0xFF, компилятор, скорее всего, сможет оптимизировать тип до uint8_t, и предупреждение исчезнет.

В качестве альтернативы вы можете написать value = (uint8_t)(value + 1u);, который имеет то же значение (но является совместимой с MISRA-C версией кода).