C99 standardowy 6.7.2.1/10 (Kopalnia nacisk):
implementacja może przeznaczyć dowolną adresowalny moduł pamięci na tyle duże, aby trzymać bitfield. Jeśli pozostanie wystarczająca ilość miejsca, pole bitowe, które następuje bezpośrednio po innym polu bitowym w strukturze, zostanie zapakowane w sąsiednie bity tego samego urządzenia. Jeśli pozostanie niewystarczająca ilość miejsca, to, czy pole bitowe, które nie pasuje, zostanie umieszczone w następnej jednostce lub zachodzi na sąsiednie jednostki, jest definiowane przez implementację. Kolejność przydzielania pól bitowych w jednostce (od wysokiego do niskiego lub niskiego rzędu po wysoki) jest zdefiniowana w ramach implementacji. Wyrównanie adresowalnej jednostki pamięci jest nieokreślone.
Zamówienie musi być udokumentowane przez implementację kompilatora.
Jednak wiele informacji na temat implementacji bitfieldów to implementacja zdefiniowana lub nieokreślona, że używanie ich do modelowania sprzętu, protokołu przewodowego lub pól bitowych formatu pliku w przenośny sposób nie jest warte wysiłku.
Jeśli chcesz, aby „bitowe pola” modelować coś zewnętrznego programu (jak wyżej rzeczy), użyj wyraźne maski, ustawiania i usuwania bitów przy użyciu standardowych operatorów bitową (|
, '& ,
~ ,
< < `itp.). Użyj funkcji pomocniczych w linii pomocniczej (lub nawet makr, jeśli musisz), aby ułatwić to zrozumienie kodu.
Uwaga: Zgodnie z normą, MSB nie jest zdefiniowany. Na twojej platformie podejrzewam, że 'zastrzeżone' zawiera MSB, ale nie jestem pozytywny. –
@Billy: To wygląda na odpowiedź. –
Er ... To dość dziwne pytanie. W deklaracji znajdują się tylko 3-bitowe pola. 2 z nich to 1-bitowe pola bitowe, tzn. Nie ma problemu z "tym końcem", ponieważ istnieje tylko 1 bit. Jedyne wielobitowe pole bitowe o nazwie 'zarezerwowane', które sugeruje, że nie jest w ogóle używane. Zasadniczo jedynym polem bitowym, o które pytasz można się ubiegać, jest 'zarezerwowane'. Pytasz konkretnie o "zarezerwowane"? Jeśli nie, wyjaśnij swoje pytanie. – AnT