Sí, puede confiar en que el compilador de C haga lo correcto aquí, siempre que el campo de bit se declare con un tipo sin signo, que tiene con uint8_t
. De la norma C99 §6.2.6.1/3:
Los valores almacenados en campos de bit sin signo y objetos de tipo char sin signo se representarán utilizando una notación binaria pura. 40)
De §6.7.2.1/9:
Un campo de bits se interpreta como un tipo entero con o sin signo que consiste en el número especificado de bits. 104) Si el valor 0 o 1 se almacena en un campo de bits de ancho distinto de cero del tipo _Bool
, el valor del campo de bits se comparará con el valor almacenado.
Y desde §6.2.5/9 (énfasis mío):
El rango de valores no negativos de un tipo entero con signo es un subrango del correspondiente tipo entero sin signo, y la representación de la el mismo valor en cada tipo es el mismo. 31)Un cómputo que involucre operandos sin firmar nunca puede desbordarse, porque un resultado que no puede ser representado por el tipo entero sin signo resultante es un módulo reducido que es mayor que el valor más grande que puede representar el tipo resultante.
Así que sí, puede estar seguro de que cualquier compilador normas conformes tendrá G.foo
desbordamiento a 0 sin otros efectos secundarios no deseados.
¿qué quieres decir? Le pidió explícitamente que almacene datos en dos bits. Además, 3 + 1 == 0 mod 4 –
Me preocuparía más lo que le ocurra a ese bit si tiene declarados otros campos de bits en esa estructura. p.ej. uint8_t bar: 2; uint8_t foo: 2; uint8_t poo: 2; ¿afectaría la barra o la caca? – Dave
¿Qué significa foo: 2? – CharlesB