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.


  • Mod

    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. 👍


Anmelden zum Antworten