2016-06-02 2 views
-1

Sagen wir für n = 4, müssen wir einen Datentyp A definieren, so dass die Größe von A 4 Bits wird. Ich weiß, wir können dies tun, indem Strukturen wieWie man einen Datentyp einer festen Größe in Bits in C definiert Programmiersprache

durch den folgenden Code verwendet
struct Bit 
{ 
    unsigned int a:4; 
} dat; 

Hier dat wird die ganzen Zahlen speichern die maximale Größe von 4 Bits von 0 bis 15 speichert also, aber wenn wir sizeof Operator ,

sizeof(dat); 

dieser Wert auf 4 geben wird (in GCC), das entspricht 4 Bytes 32 Bits, dh, aber ich brauche einen Weg dat Variable definieren die Größe 4 Bits.

+3

'char' ist der kleinste Typ und die Granularität der Adressierung (' sizeof (char) == 1' ist garantiert). Dies ist ein XY-Problem. Bitte geben Sie Ihr ** tatsächliches ** Problem an. – Olaf

+1

Das ist unmöglich. Nichts kann kleiner sein als ein "char". 'unsigned int a: 4' bedeutet nicht" das sind 4 Bits ", aber" 4 Bits dieses 'unsigned int' heißen 'a'". Die restlichen Bits existieren noch, sind jedoch unbenannt. – molbdnilo

+0

Nebenbei, was könnte "sizeof (foo)" mit einem 4-Bit "foo" bewerten? – Quentin

Antwort

3

In der C-Standard und mit aktuellen Mainstream-Computern können Sie nicht. Auf der allgemein verwendeten Hardware, der Wortgröße, ist die "native" Datengröße, mit der die CPU arbeiten kann, 8 Bit oder eine Vielzahl (16, 32, 64) davon. In der Vergangenheit verwendeten Computer andere Wortgrößen (wie 9 oder 12), aber ich kenne keine moderne Maschine mit weniger als 8 Bits pro Wort.

Der kleinste integrale Typ aktuelle C-Standards beschreiben ein (u) int8_t mit 8 Bits.

Mit Ihrem Beispiel

struct Bit 
{ 
    unsigned int a:4; 
} dat; 

Es gibt keine Anforderung eines minimalen oder maximalen Größe von dieser in der Norm. Die CPU wird jedoch Anforderungen benötigen. Zum einen er uint hat bekommt aa Vielfaches von 8

Jetzt sein, wenn wir

struct Bit 
{ 
    unsigned int a:4; 
    unsigned int b:4; 
} dat; 

Der Compiler könnte aber diejenigen Felder in die gleiche 8-Bit-Bereich und fügen Sie die erforderliche Verschiebung auf alle tun, wo Operationen, aber das ist nicht unbedingt erforderlich. Ein Compiler könnte dies auch in zwei verschiedene Wörter schreiben.

Es gibt keine Möglichkeit, auf weniger als ein Wort zuzugreifen.

+0

Normalerweise unterscheidet sich ein Wort von einem Byte. Für x86/x64 wird die Wortgröße manchmal als 32-Bit oder 64-Bit bezeichnet, aber in den Dokumentationen ist ein "Wort" 16-Bit. "Wort" sollte hier wahrscheinlich überhaupt nicht verwendet werden, es ist mehrdeutig. Der im C-Standard verwendete Begriff ist "Byte" für die kleinste adressierbare Einheit, die oft ein Oktett ist. – ElderBug

-3

Dies ist architekturabhängig. Die meisten Prozessoren können nicht auf Speicher zugreifen, der kleiner als Byte ist, und in Ihrem Fall sind 32 Bit wahrscheinlich der kleinste Speicherbereich.

+1

* "in Ihrem Fall 32 Bits ist wahrscheinlich der kleinste Teil des Speichers" * Es sei denn, OP verwendet eine sehr obskure Arcitechture, wobei 'sizeof (char) == sizeof (unsigned int) == 1' und' CHAR_BIT == 32'; das ist sehr unwahrscheinlich. – user694733

-3

Die Größe hier ist 32 Bit, weil Sie scheinen, eine 32-Bit-Maschine zu verwenden und in jedem Zyklus werden 32 Bit gelesen (die zusätzlichen 28 Bit sind die vom Betriebssystem hinzugefügten Füllbits).

+0

Das Deaktivieren von Padding hilft nicht auf Bit-Ebene. – user694733

Verwandte Themen