Hi Bruno,
Du begibst Dich hier auf ziemlich dünnes Eis, da es genau abzuwägen gilt, ob der Verwaltungsaufwand durch die Ersparnis von Speicherplatz gerechtfertigt ist.
Um es vorwegzunehmen: Den von Dir gewünschten Datentyp gibt es definitiv nicht! Du kannst Dir ein Hilfskonstrukt basteln, wobei ich Dir zum Basistyp unsigned char raten würde. Du dimensionierst Dein Array der Länge n dann eben auf n/2+1 uns speicherst die Elemente mit ungeraden Indizes in den ersten 4 Bits, die mit geraden Indizes in den zweiten.
Der Zugriff und die Zuweisung wären dann möglich durch Einsatz der Operatoren ||, &&, >. Mit mod 2 bzw. % 2 kannst Du abfragen, ob der Index gerade oder ungerade ist.
Es ist jedoch insgesamt noch ein Wort der Warnung angebracht. Du hast kein Wort darüber verloren, auf welcher Architektur Du dieses realisieren möchtest. Du solltest Dir in jedem Fall das Manual für den Compiler genau durchlesen, da die zugehörigen Linker häufig ein sog. ‚Allignment‘ ausführen, also Variablen nur auf bestimmten Adressen beginnen lassen. Dies hat den Grund, dass ein Zugriff mit weniger Bustakten realisiert werden kann. Eine falsch gesetzte Option an dieser Stelle kann Dir alle Liebesmühe zunichte machen.
Gruß
Ted
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]