2010-07-22 21 views
22

mögliche Dubletten:
What does ‘: number’ after a struct field mean?
What does ‘unsigned temp:3’ meansVerwendung des: Operator in C

Hallo an alle, ich hasse diese Art von Frage zu stellen, aber es nervt mich wirklich, so Ich werde fragen:

Was ist die Funktion des: -Operators im folgenden Code?

#include <stdio.h> 

struct microFields 
{ 
    unsigned int addr:9; 
    unsigned int cond:2; 
    unsigned int wr:1; 
    unsigned int rd:1; 
    unsigned int mar:1; 
    unsigned int alu:3; 
    unsigned int b:5; 
    unsigned int a:5; 
    unsigned int c:5; 
}; 

union micro 
{ 
    unsigned int microCode; 
    microFields code; 
}; 

int main(int argc, char* argv[]) 
{ 
    micro test; 
    return 0; 
} 

Wenn jemand überhaupt interessiert, zog ich diesen Code aus dem unten stehenden Link: http://www.cplusplus.com/forum/beginner/15843/

ich wirklich wissen möchte, weil ich weiß, ich habe das schon irgendwo gesehen, und ich möchte es verstehen denn wenn ich es wieder sehe.

Danke!

+0

Beachten Sie, dass das Layout der Bitfelder Implementierung definiert, so das Ergebnis der Zugriff auf Bitfelder in einem int durch eine Vereinigung ist nicht definiert. Tun Sie dies nicht im Produktionscode, verwenden Sie stattdessen Bitmasken und Verschieben. – starblue

Antwort

38

Sie sind Bit-Felder, ein Beispiel ist, dass unsigned int addr:9; erstellt ein addr Feld 9 Bits lang.

Es wird häufig verwendet, um viele Werte in einen integralen Typ zu packen. In Ihrem speziellen Fall definiert es die Struktur eines 32-Bit-Microcode-Befehls für eine (möglicherweise) hypothetische CPU (wenn Sie alle Bitfeldlängen addieren, summieren sie sich zu 32).

Die Vereinigung ermöglicht es Ihnen, in einem einzigen 32-Bit-Wert zu laden und dann Zugriff auf die einzelnen Felder mit Code wie (kleinere Probleme als auch fixiert, insbesondere die Erklärungen von code und test):

#include <stdio.h> 

struct microFields { 
    unsigned int addr:9; 
    unsigned int cond:2; 
    unsigned int wr:1; 
    unsigned int rd:1; 
    unsigned int mar:1; 
    unsigned int alu:3; 
    unsigned int b:5; 
    unsigned int a:5; 
    unsigned int c:5; 
}; 

union micro { 
    unsigned int microCode; 
    struct microFields code; 
}; 

int main (void) { 
    int myAlu; 
    union micro test; 
    test.microCode = 0x0001c000; 
    myAlu = test.code.alu; 
    printf("%d\n",myAlu); 
    return 0; 
} 

Diese gibt 7 aus, das sind die drei Bits, die das Bitfeld alu bilden.

7

Es ist ein bit field. Die Zahl nach dem Doppelpunkt gibt an, wie viele Bits jede Variable belegt.