Sì, puoi fare affidamento sul compilatore C per fare la cosa giusta qui, purché il campo bit sia dichiarato con un tipo senza segno, che hai con uint8_t
. Dallo standard C99 §6.2.6.1/3:
I valori memorizzati in campi di bit non firmati e oggetti di tipo unsigned char devono essere rappresentati utilizzando una pura notazione binaria. 40)
Da §6.7.2.1/9:
Un campo di bit viene interpretato come un tipo intero con o senza segno costituito dal numero di bit specificato. 104) Se il valore 0 o 1 è memorizzato in un campo di bit di larghezza diversa da zero di tipo _Bool
, il valore del campo di bit deve essere uguale al valore memorizzato.
E da §6.2.5/9 (enfasi mia):
L'intervallo di valori negativi di tipo intero con segno è un sottoinsieme di tipo intero senza segno corrispondente, e la rappresentazione del lo stesso valore in ogni tipo è lo stesso. 31)Un calcolo che coinvolge operandi senza segno non può mai eccedere, perché un risultato che non può essere rappresentato dal tipo di intero senza segno risultante viene ridotto modulo il numero che è maggiore del valore più grande che può essere rappresentato dal tipo risultante.
Quindi sì, si può essere sicuri che qualsiasi compilatore standard conformi dovrà G.foo
troppo pieno a 0 senza altri effetti collaterali indesiderati.
fonte
2011-02-05 18:07:57
cosa intendi? L'hai chiesto esplicitamente di memorizzare i dati in due bit. Inoltre, 3 + 1 == 0 mod 4 –
Sarei più preoccupato di cosa succede a quel bit se hai altri bitfield dichiarati in quella struttura. per esempio. uint8_t bar: 2; uint8_t pippo: 2; uint8_t cacca: 2; interesserebbe la barra o la cacca? – Dave
Cosa significa foo: 2? – CharlesB