uint8_t - unsigned c
¿Por qué este código para incrementar un uint8_t incluye `& 0xFF`? (2)
Al leer algunos códigos de ejemplo para DMAs de Xilinx, encontré este fragmento de código:
value = (value + 1) & 0xFF
donde valor es un uint8_t.
¿Cuál es el punto de la & 0xFF
? ¿Por qué no simplemente escribir value = value + 1
?
Este tipo de código es común cuando desea evitar problemas con las promociones de tipo implícitas , o cuando simplemente desea demostrar que ha considerado las promociones implícitas cuando escribió el código, lo que es una buena práctica de programación.
uint8_t
es un tipo de entero pequeño y, por lo tanto, siempre se promueve a int
siempre que lo uses en una expresión. El resultado de (value + 1)
es siempre int
.
Sin el enmascaramiento, algunos compiladores dan advertencias como "intentar almacenar int en uint8_t". He encontrado tales advertencias en varios compiladores. En teoría, int & 0xFF
sigue siendo un int, pero como no puede tener un valor mayor que 0xFF, es probable que el compilador optimice el tipo hasta uint8_t y la advertencia desaparezca.
Alternativamente, puede escribir value = (uint8_t)(value + 1u);
que tiene el mismo significado (pero es una versión compatible con MISRA-C del código).
Supongo que este código estaba destinado a funcionar correctamente incluso si el value
no es un tipo de 1 byte (8 bits). La máscara de bits 0xFF
se asegura de que solo se mantenga el último byte del valor.