Der Martin: C - casten

Beitrag lesen

Hallo,

So wie's aussieht (so wie ich den C-Standard verstehe), kann man relativ ungefährdet signed integer auf unsigned integer casten

natürlich, die *Interpretation* eines Haufens von 16/32bits Information ist schließlich immer Sache des verarbeitenden Programmteils.

auch wenn der (Rang des) unsigned integer gleich groß oder kleiner als der (Rang des) signed integer ist und darum der signed-Wert eigentlich nicht in den unsigned umgeformt werden kann, ohne das Vorzeichen oder mehr zu verpfuschen.

Hä? Was meinst du mit "Rang"? Wenn Typ U und Typ V beide auf dem Grundtyp Integer beruhen (also egal ob mit oder ohne Vorzeichen, egal ob 8,16,32bit, egal ob int, char, enum), dann bedeutet ein Typecast von U auf V: Nimm die binäre Repräsentation von U und interpretiere sie nach dem Muster von V.

sint32 a = 0xffffffff;
uint32 b = (uint32)a; a = 0xffffffff

Genau. a war vorher -1, b ist jetzt 4294967295 (=2^32-1).

Wenn man jedoch in die andere Richtung casten will, ist das Ergebnis angeblich "implementation-specific".

Ach?

uint32 a = 0xffffffff;
sint32 b = (sint32) a; b = ???

Das Beispiel ist noch deutlicher: a war 4294967295, b ist jetzt -1.

Es scheint allerdings keine Implementierung zu geben, wo nicht einfach die Bit-Repräsentation als signed integer interpretiert wird.

Eben, sag ich doch.

Oder hat jemand schonmal irgendein Problem beim casten von unsigned int auf (vom Rang gleich grosses oder kleineres) signed int erlebt?

Nein - abgesehen davon, dass ich nicht hundertprozentig sicher bin, was du mit dem ominösen Begriff "Rang" meinst, war das in jedem Fall von 32bit-Windows bis runter zu 8bit-Mikrocontrollern problemlos.

So long,
 Martin

--
Schildkröten können mehr über den Weg berichten als Hasen.