mikrocontroller.net

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


Autor: MK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann in einer struct ein Bitfeld definieren:
typedef struct
{
    /*un-*/ signed int wert:24;
} unsinn_t;
...

unsinn_t variable;
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.

Autor: Ahem (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
typedef struct {
short highest;
short middle;
short lowest;
} _24Bit;

_24Bit a, b , c;

Über entsprechende Makros könnten dann die einzelnen Bytes gesetzt 
werden.
TO_INT(x) (x.highest << 16 + x.middle << 8 + x.lowest)

FROM_INT(x, y) {x.highest = ((y && 0xF0) >> 16); x.middle = ((y && 0xF0) >> 8); x.lowest = y && 0x0F;}

// der ausdruck a = b + c wird dann

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.

Autor: Ahem (Gast)
Datum:

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

Autor: zwieblum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und dann stellt sich die preisfrage:

_24Bit a[100];

sizeof(a) liefert 300 oder 400?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.