zwei 8 bit zu 16 bit



  • Hallo,

    ich habe zwei 8 bit Werte.
    128 64 32 16 8 4 2 1
    1 0 0 1 0 0 0 1 die ersten 8 bit

    &

    0 0 1 0 1 0 0 1 die zweiten 8 bit

    oberer Wert in dezimal 145
    unterer Wert in dezimal 41

    Diese zwei 8 bit möchte ich zu 16 bit machen
    32768 16384 8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1
    1 0 0 1 0 0 0 1 0 0 1 0 1 0 0 1
    entspricht in dezimal 37161

    Ich möchte aus den obereb zwei 8 bit Strömen ein 16 bit machen.

    Weiß wer wie ds geht ?

    Danke


  • Mod

    (high_byte << 8) + low_byte;
    

    edit: + hat eine höhere Priorität als <<, daher sind Klammern nötig.



  • Hallo,

    danke.
    Das ganze hatt ich schon ausprobiert und bin dann in die Zeile ohne die verschiebung gekommen und dachte es geht nicht. Naja jetzt passt es wieder.
    Wie kann ich das ganze im detail verstehen.

    high low

    11110000 00001111
    addition
    erg 11111111
    high<<8 low
    11110000 00000000 00001111
    erg 1111000000001111
    Richtig ?

    danke



  • geht doch auch mit ner union, oder nicht?

    union
    {
    char blabla[2];
    short ausgabe;
    }



  • Das wär undefiniertes Verhalten.



  • dot schrieb:

    Das wär undefiniertes Verhalten.

    inwiefern?



  • Weil du (nach Standard) nur den Datentyp auslesen darfst, den du auch vorher reingeschrieben hast. Bzw. ist nur diese definiert.

    Und die union nimmt auch keine Rücksicht auf die Endianess. (Das ist wohl das größere Problem)



  • hallo,

    ich hätte da auch eine frage. sie bezieht sich auf das, was campionissimo geschrieben hat:

    campionissimo schrieb:

    Hallo,

    danke.
    Das ganze hatt ich schon ausprobiert und bin dann in die Zeile ohne die verschiebung gekommen und dachte es geht nicht. Naja jetzt passt es wieder.
    Wie kann ich das ganze im detail verstehen.

    high low

    11110000 00001111
    addition
    erg 11111111
    high<<8 low
    11110000 00000000 00001111
    erg 1111000000001111
    Richtig ?

    danke

    das verstehe ich nicht, warum ist 10010001 (=145 als dezimalzahl) als hight-byte 11110000 (=240 als dezimalzahl)?
    das gleiche bei low-byte.

    ich mein, 145!=240

    könnte mir das mal bitte jemand erklären?



  • Wo steht in dem Zitat, das du von campionissimo hast, etwas von 145?

    Die 145 stehen im ersten Post. Und das ist ein ganz anderes Beispiel.



  • ok, das hab ich dann wohl falsch verstanden.

    aber bei 145, was ist da low-byte und high-byte?
    145 dezimal = 10010001 binär


  • Mod

    145 ist nur ein Byte, das hat keinen High- und keinen Low-Anteil. Oder wenn du so möchtest, kannst du sagen es hat low 145 und high 0.

    Das ist so gemeint: Das was man klassischerweise ein Datenwort nennt (aus den Zeiten als diese heißen neuen 16 Bit Rechner auf den Markt kamen), besteht aus zwei Bytes (klassisch: Zahlen von 0 bis 255). Das heißt, es ist eine 16 Bit Zahl, 0 bis 65767. Davon nennt man das niederwertige Byte (das heißt das hintere Byte in Binärschreibweise, das was für die hinteren Stellen verantwortlich ist) das Low-Byte und das andere das High-Byte.

    Wenn du ein bisschen Fit bist mit unterschiedlichen Zahlensystemen: Die hinteren 8 Ziffern im Binärsystem sind low, die vorderen High. Oder im Hexadezimalsystem die hinteren bzw. die vorderen zwei Ziffern. Oder im 256er System die erste bz.w die zweite Ziffer.



  • ok, das alles geht aber nur bei 16 bit? (auch bei 32 bit? allgemein bei bytes, die durch 2 zeilbar sind, z. B. 64?)

    ein kleines beispiel:
    die zahl 43690, in binär 1010101010101010;
    davon sind jetzt also die ersten 8 bits (10101010) ist das high-byte und die letzten 8 bits (wieder 10101010) sind dann also low-byte.

    ist das so richtig?





  • danke.

    ich habe versucht, diesen code in c umzusetzen:

    campionissimo schrieb:

    Hallo,

    danke.
    Das ganze hatt ich schon ausprobiert und bin dann in die Zeile ohne die verschiebung gekommen und dachte es geht nicht. Naja jetzt passt es wieder.
    Wie kann ich das ganze im detail verstehen.

    high low

    11110000 00001111
    addition
    erg 11111111
    high<<8 low
    11110000 00000000 00001111
    erg 1111000000001111
    Richtig ?

    danke

    mein ergebnis:

    #include <stdio.h>
    
    int main()
    {
        int a=240; // =  binär 11110000
        int b=15; // = binär 00001111
        int c=240|15; // liefert das ergebnis 255 (= binär 11111111) stimmt also mit dem oben überein
        unsigned int d=a<<8+b; // liefert NICHT das ergebnis aus dem obrigen code
                               // mein ergebnis: 2013265920 (= binär 1111000000000000000000000000000 )
        printf("c = %d\n",c);
        printf("d = %u\n",d);
        return 0;
    }
    

    wo liegt da der fehler?



  • Dass << eine niedrigere Präzedenz hat als +...

    Aber auch dann sollte dort statt einer 8 eine 4 stehen, wenn du 11111111 als Ergebnis sehen willst 😉



  • @dot: viele dank, da hab ich die klammern vergessen.

    jetzt kommt auch das gewünsche ergebnis raus.

    was meinst du mit 4 statt 8? so wie es oben steht, scheint es zu stimmen, c ist 255.



  • Sry, das mit 4 statt 8 war natürlich Schwachsinn 😉



  • Hallo,

    ich habe anfang zwei 8 bit ströme gezeigt.
    die werden einzeln gerechnet.
    z.B.

    erste acht bit
    11000111
    ergibt 199
    zweite acht bit
    00101001
    eribt 41
    wenn ich das auf 16 bit zusammenfüge sind es
    0010100111000111
    10695
    und hier gibt es 8 bit high und 8 bit low
    Beim ersten gibt es keine 8 bit high.
    Gruß


Anmelden zum Antworten