(unsigned) char als Zahl



  • Hallo auch,

    ich habe mal 😉 den dumme Frage.

    Eine Programm überträgt auf der seriellen Schnittstelle eine 16bit lange Zahl in 2 Zeichen. Die zu übertragende Zahl ist 15bit (0...14) + 1bit(15) für das Vorzeichen.
    Das höchste bit ist also das Vorzeichen.

    Wie wandele ich sowas am schlauesten in einen Integer?

    Momentan (falsch)

    Es gibt einen string
    string[0] //Bits 8 bis 15
    string[1] //Bits 0 bis 7

    int i = singed char(string[0])*256+unsigned char(string[1])

    Warum geht das nicht richtig; 😕

    Grüße



  • Dein Problem ist, daß negative Zahlen üblicherweise im Zweierkomplement dargestellt werden - und indem du das untere Bit der Zahl als unsigned char interpretierst, zerlegst du die Hälfte der Komplement-Darstellung.

    Als Lösung könntest du den String zunächst (ohne Rücksicht auf das Vorzeichen) in einen unsigned short packen und den nach int konvertieren. Oder du verwendest Bit-Operatoren (short x=(s[0]<<8)|s[1]).

    (btw, ein int besteht afair aus 4 Byte)



  • Aber das sign-Bit sollte er doch schon erstmal ausmaskieren und das Ergebnis dann mit (-1) multiplizieren.



  • Dippl Insch schrieb:

    Wie wandele ich sowas am schlauesten in einen Integer?

    1. sende das 15-bit wort als 2 bytes.
    2. beim empfänger schiebst du es zusammen (ergibt ein 16-bit wort)
    3. kopiere bit 14 des 16-bit worts nach bit 15.
    4. setze bit 14 auf 0

    weiss nicht ob das am schlauesten ist, aber sollte funzen...


Anmelden zum Antworten