Forum: PC-Programmierung Kann man in C einen 3-Byte Datentyp generieren?


von MK (Gast)


Lesenswert?

Hallo,

kann man in C einen 3-Byte Datentyp generieren? Also einen 24-Bit 
DatenTyp, der sich genauso ansprechen lässt wie ein char,int,long?

Mittels typedef, struct/union fällt mir keine Lösung (*) ein, ich denke 
auch nicht, dass es geht, aber wer weiss? :)

(*) Klar würde ein 3-Byte struct gehen, aber dann müsste man ja jedes 
Byte separat ansprechen, oder?

MK

von Klaus W. (mfgkw)


Lesenswert?

Man kann in einer struct ein Bitfeld definieren:
1
typedef struct
2
{
3
    /*un-*/ signed int wert:24;
4
} unsinn_t;
5
...
6
7
unsinn_t variable;
8
variable.wert = 12: /* etc. */

Der Rest auf ganze int (also wahrscheinlich ein Byte) wird dann aber
vom Compiler mit einem Füllbyte überbrückt, wodurch zwar wert nur
3 Byte hat, die struct aber dann doch wieder 4.

Ansonsten: nein, geht nicht.

von Ahem (Gast)


Lesenswert?

Grundsätzlich ist es nicht möglich einen 3-Byte Typ zu deklarieren, der 
in den üblichen Integerausdrücken verwendet werden kann.
Die Operationen +,-,* usw. sind eben nur für die integralen Typen 
definiert.

In C++ wäre das ein wenig besser zu machen.

Allerdings ist die Idee mit typedef/struct sinnvoll.

Man muss dann nur in den Ausdrücken, dafür sorgen, das als Zwischenwert 
bzw. temporäres Ergebnis ein vordefinierter Typ entsteht (also int).
Wie das geht, ist Dir wahrscheinlich klar.
1
typedef struct {
2
short highest;
3
short middle;
4
short lowest;
5
} _24Bit;
6
7
_24Bit a, b , c;

Über entsprechende Makros könnten dann die einzelnen Bytes gesetzt 
werden.
1
TO_INT(x) (x.highest << 16 + x.middle << 8 + x.lowest)
2
3
FROM_INT(x, y) {x.highest = ((y && 0xF0) >> 16); x.middle = ((y && 0xF0) >> 8); x.lowest = y && 0x0F;}
4
5
// der ausdruck a = b + c wird dann
6
7
FROM_INT(a,TO_INT(b) + TO_INT(c))

Ich habe es nicht getestet. Aber es sollte ziemlich korrekt sein.
Wenn es vorzeichenbehaftet sein, soll geht es natürlich noch ein bischen 
anders. Ausserdem musst Du auf Überläufe achten.

von Ahem (Gast)


Lesenswert?

Um es korrekt zu machen, sollte es dann noch heissen:
1
TO_INT(x) (((int) x.highest) << 16 + ((int) x.middle) << 8 + ((int) x.lowest))

von zwieblum (Gast)


Lesenswert?

und dann stellt sich die preisfrage:

_24Bit a[100];

sizeof(a) liefert 300 oder 400?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.