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.