2 chars zu short



  • Hallo,
    ich möchte 2 chars zu einem short konvertieren. Mein momentaner Code sieht so aus:

    unsigned high = 42;
    unsigned char low = 23;
    unsigned short both = static_cast<unsigned short>(high << 8 | low);
    std::cout << both << std::endl;
    // Ausgabe 10775
    

    Nun funktioniert diese Code nur mit Little-Endian Maschinen. Auf wikiepdia steht jetzt, dass heutige PC Systeme alle Little-Endian benutzen, stimmt das, und wenn nicht, was für eine Plattformübergreifende Methode gibt es?


  • Mod

    static_cast<unsigned short>((high << 8) + low);
    

    😃

    edit: Und ob alle heutigen PC-Systeme LittelEndian benutzen kommt auf deine genaue Definition von PC und heutig an. Man kann jedenfalls schon sagen, dass es nicht unrealistisch ist, mal einem BigEndian System zu begegnen und man sich nicht einschränken sollte. Besonders wenn es so einfach ist wie hier!

    edit: Ups, Operator + hat Vorrang vor <<. Klammern gesetzt.



  • Idee: Du könntest die Funktion htons nutzen. Diese sollte auf allen POSIX-System vorhanden sein und konvertiert die Eingabe in die sogenannte Network-Order (Big-Endian).



  • @SeppJ:
    Aber wenn ich jetzt doch ein Big-Endian System habe dann sieht high als short ja so aus:

    00101010 00000000
    

    Wenn ich das jetzt nach links shifte kommt doch 0 raus 😕


  • Mod

    Charakter schrieb:

    @SeppJ:
    Aber wenn ich jetzt doch ein Big-Endian System habe dann sieht high als short ja so aus:

    00101010 00000000
    

    Wenn ich das jetzt nach links shifte kommt doch 0 raus 😕

    Nein. Die Shiftoperatoren arbeiten unabhängig von der internen Darstellung. Das sind mathematische Operatoren.



  • Das bedeutet also, dass ein Shiftoperator nach links bei Big-Endian Systemen zu einem Shiftoperator nach rechts mutiert, oder wie soll ich das verstehen? Denn Little-Endian ist ja die Darstellung, wie wir sie im Alltag benutzen.


  • Mod

    Charakter schrieb:

    Das bedeutet also, dass ein Shiftoperator nach links bei Big-Endian Systemen zu einem Shiftoperator nach rechts mutiert, oder wie soll ich das verstehen? Denn Little-Endian ist ja die Darstellung, wie wir sie im Alltag benutzen.

    Nein. Die interne Darstellung interessiert den Shiftoperator überhaupt gar nicht. Da kann auch ein kleiner Kobold mit Zettel und Stift im Rechner sitzen, es kommt trotzdem das gleiche dabei raus. Oder der Rechner rechnet intern mit dreiwertigen Bits. Oder Quantenbits. Alles egal.



  • Charakter schrieb:

    Denn Little-Endian ist ja die Darstellung, wie wir sie im Alltag benutzen.

    Im Allrag wie in der Mathematik benutzt man Big-Endian.



  • ipsec schrieb:

    Im Allrag wie in der Mathematik benutzt man Big-Endian.

    1               1                11
    Eintausend  Einhundert  Elf
    

    Wo sind denn da die großen Zahlem am Ende?



  • Also zumindest bei meinem Zahlenverständnis ist immer noch Eintausend > Einhundert > Elf.



  • Charakter schrieb:

    Hallo,
    ich möchte 2 chars zu einem short konvertieren. Mein momentaner Code sieht so aus:

    unsigned high = 42;
    unsigned char low = 23;
    unsigned short both = static_cast<unsigned short>(high << 8 | low);
    std::cout << both << std::endl;
    // Ausgabe 10775
    

    Nun funktioniert diese Code nur mit Little-Endian Maschinen. Auf wikiepdia steht jetzt, dass heutige PC Systeme alle Little-Endian benutzen, stimmt das, und wenn nicht, was für eine Plattformübergreifende Methode gibt es?

    Sofern ein unsigned char auf der jeweiligen Plattform tatsächlich einem Oktett entspricht, ist es egal, ob Little- oder Big-Endian. Dann wird das so funktionieren.

    Und es ist nicht alles Little-Endian. Die JVM arbeitet z.B. mit Big-Endian. Zumindest nach außen.



  • Charakter schrieb:

    ipsec schrieb:

    Im Allrag wie in der Mathematik benutzt man Big-Endian.

    1               1                11
    Eintausend  Einhundert  Elf
    

    Wo sind denn da die großen Zahlem am Ende?

    Sie stehen am linken Ende. Und das Ende ists, um das es geht:

    wikipedia schrieb:

    Bei Big-Endian [...] wird das Byte mit den höchstwertigen Bits (d. h. die signifikantesten Stellen) zuerst gespeichert, das heißt an der kleinsten Speicheradresse.


Anmelden zum Antworten