Signed integer aus 14 bit



  • Schönen guten Tag,
    ich habe ein Problem mit dem einlesen eines 14bit Wertes von einer API. Es funktioniert für positive Werte aber bei negativen Werten kommen zu hohen Zahlen raus.
    Wäre schön wenn ihr mir helfen könntet.

    uint8_t data[2] =  {0};
    
    funktion(data); // Einlesen der Werte
    int32_t wertI = data[0] + (data[1] << 8);
    wertI  = wertI  & 0x3FFF; // Unser Wert besteht nur aus den ersten 14bits 
    if (wertI & 0x2000) // Falls es sich um eine negative Zahl handelt <<<--- hier müsste der Fehler sein
    {
    	wertI |= 0xfffc0000;
    }
    

    Ich habe eine online eine Lösung für int16_t gefunden:
    int16_t wertL = (int16_t)(wertl << 2) / 4;

    aber ich würde trotzdem gerne wissen wo der Fehler bei int32_t ist ?


  • Mod

    Dieser Beitrag wurde gelöscht!


  • Das ist doch eine Aufgabe, wo man super toll Tests schreiben kann!

    Du erwartest jetzt von uns, dass wir wissen, wie deine API funktioniert. Tut die so, als gäbe es "normale" 14-Bit-Integer, wo das erste Bit über das Vorzeichen entscheidet? Was sagen das 15. und 16. Bit aus? Müssen die ignoriert werden oder haben die immer einen Wert?

    Ansonsten wirklich: schreib Testcases!



  • @SOS30 sagte in Signed integer aus 14 bit:

      wertI |= 0xfffc0000;
    

    Überprüfe mal die Anzahl der Bits.
    Da du ja komplett 16 dazudichten musst, sollten vorn 4x f stehen.
    und da du nur 14 Bit übernehmen willst, sind 4x 0 am Ende zuviel

    wertI |= 0xffffc000;

    wäre sinnvoller (wenn der 14-Bit-Wert im Zweierkomplement vorliegt)


Anmelden zum Antworten