Sup!
Tja also... aus einem Byte-Strom müssen mitten in diesem Strom verstreute Bits zu beliebigen signed/unsigned-Datentypen zusammengebastelt werden (Frag' nicht warum das sinnvoll ist, das ist einfach eine Kundenanforderung).
Es können also z.B. 19 Bits ("O")folgendermaßen über 3 Byte verstreut ankommen:
xxxOOOOO
OOOOOOOO
OOOOOOxx
Damit der Algorithmus alle Arten von Typen zusammensetzen kann, werden die Bits erstmal in einen uint32 "eingelesen" (mit viel shiften und and-en) und dann zum gewünschten Datentypen gecastet.
Es wäre aber anscheinend "besser", wenn man in einen sint32 einlesen würde, weil casten von sint32 nach uint32 im C-Standard allem Anschein nach besser spezifiziert ist als casten von uint32 nach sint32. (In meinem Kernighan-Richie ist es in Anhang A.6.2, "Integer-Umwandlung", beschrieben).
Man könnte natürlich den Algorithmus auch sechsmal schreiben, um ohne casten die Datentypen u/s-int8/16/32 einlesen zu können; das wäre aber nicht wirklich effizient, denn der Kram läuft auf einem embedded system, und Codesize ist relevant.
Ähnlich diesem Problem gibt es auch noch eine Funktion, die auf alle diese Datentypen Vergleichsoperationen anwenden soll. Die will ich auch nicht unbedingt sechsmal schreiben.
Und um eine generische Funktion schreiben zu könne, müsste ich wieder etwas casten - ggf. auch uint32 nach sint32.
Gruesse,
Bio