c - Grundlæggende spørgsmål vedrørende strukturer

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg går igennem en Windows-enhedsdriver, og jeg så strukturkode som denne:


struct driver1
{
       UINT64 Readable     : 1; 
       UINT64 Writable     : 1; 
       UINT64 Executable   : 1; 
       UINT64 Control      : 3; 
       UINT64 Status       : 1; 
       UINT64 Reserved     : 51; 
       UINT64 Available1   : 5; 
       UINT64 IsMapped     : 1;
};


Er hver UINT64 en enkelt bit? Er et kolon repræsenteret bits?

Bedste reference


Det betyder, at Readable, Writable og Executable hver tager lidt op, Control tager 3, Reserved 51 og så videre.


Se http://publications.gbdirect.co.uk/c\_book/chapter6/bitfields.html for mere info. [8]


UINT64 betyder simpelthen, at hele bitfeltet vil være inde i et 64 bit usigneret heltal.

Andre referencer 1


Det er ideen, ja. Det hedder en bitfield. Nummeret angiver antallet af bits, som koderen beder om, at feltet skal tage op. Hvis du tæller dem alle sammen, vil du se, at de tilføjer op til 64.


Problemet er, at C ++ (i modsætning til Ada) ikke giver nogen reel måde at sikre, at hele strukturen kun tager op 64 bits. Så hvis du kompilerer dette på et andet system end det det var designet til at løbe på, så kontrollerer jeg det helt sikkert.


Når jeg skriver enhedsdrivere i C ++, bruger jeg ikke bitfelter. Jeg bruger bitmasker i stedet. Problemet er der selvfølgelig, at du skal være opmærksom på, hvordan din platform bestiller sine byte.

Andre referencer 2


Disse er bitfelterne i C, så du kan få adgang til disse bits uafhængigt via strukturen. [9]