Kann man in C einen 3-Byte Datentyp generieren?

Gast #1247090
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
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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.