Fallstrick Typwandlung
-
Ich muss einen Bytestrom interpretieren und muss hierfür aus zwei 8-Bit Werte ein 16-Bit Wert berechnen. Hierbei fiehl mir folgendes auf.
int main(int argc, char **argv) { int8_t b5 = -6; // = 0xFA int8_t b6 = 4; // = 0x04 int ID = b6 << 8; // = 0x400 ok int ID1 = ID | b5; // = 0xFFFFFFFA ??? Sollte eigentlich 0x04FA sein int ID2 = ID | (b5 & 0xFF); // = 0x000004FA ok return 0; }
ID1 hat einen anderen Wert als ID2. Warum?
PS:
Der Code ist eigentlich Java. Das Verhalten ist aber identisch. Daher kann ich die Daten nicht mittels einer Struct-Zeigers interpretieren.
-
Konvertierungen zwischen Zahlen sind wertbewahrend, die Repräsentation kann sich ändern.
ID | b5;
bevor die Verknüpfung durchgeführt werden kann, müssen erst einmal beide Operanden in einen gemeinsamen Typen konvertiert werden (hier: int, siehe usual arithmetic conversions).
b5 hat den Wert -6, nach der Konvertierung zu int ist der Wert immer noch -6, die Repräsentation von -6 durch den Typ int hat aber auf jeden Fall das höchstwertige Bit gesetzt, (+weitere je nach Darstellungsmethode).Praxistip: Bei Bitoperationen und -shifts immer unsigned Typen verwenden. Wenn die Eingabe vorzeichenbehaftet ist, immer zuerst in den korrespondierenden unsigned Typen gleicher Größe konvertieren.
-
Ok, danke das bestätigt meinen Verdacht.