Frage zu Big/Little Endian



  • DIe Frage könnte jetzt ein wenig doof klingen, aber da ich die Bitoperationen in meinem lehrplan immer vernachlässigt hab, hab ich davon jetzt echt keine Ahnung :)(und leider konnte mir ne google suche auch nicht wirklich helfen).

    Nehmen wir mal an, ich hätte folgenden code:

    newSign=startByte;//newSign ist int, der rest char
    newSign<<=6;
    newSign+=followingByte1;
    newSign<<=6;
    newSign+=followingByte2;
    newSign<<=6;
    newSign+=followingByte3;
    //newSign soll dann intern so aussehen: 
    //|startByte|followingByte1|followingByte2|followingByte3|
    

    würde ich da andere Zahlenergebnisse erwarten können, je nachdem ob ich Big- oder Little- Endian verwende? Oder ist das egal?

    Dieser Codeschnipsel ist ein Ausschnitt aus einem code zur konvertierung von UTF8 nach UTF32 von daher ist das schon recht wichtig 😃



  • Von UTF-8 gibts keine Big- und Little-Endian Varianten, diese Kodierung ist genau und eindeutig definiert (siehe Wikipedia).


  • Mod

    otze schrieb:

    würde ich da andere Zahlenergebnisse erwarten können, je nachdem ob ich Big- oder Little- Endian verwende?

    nein, little-/big-endian ist doch eine frage der objekt-repräsentation, nicht der value-representation. soweit ich es erkenne, hängt das ergebnis hier nur davon ab, ob char vorzeichenbehaftet ist oder nicht, und wenn ja, wie negative integer dargestellt werden (vorausgesetzt, ints sind groß genug, um vorzeichenlose überläufe beim shift auszuschließen).



  • Das wäre aber recht einfach durch eine Ersetzung des +-Zeichens durch ein |-Zeichen (binäres Oder) behoben:

    newSign |= followingByte1;
    

  • Mod

    .filmor schrieb:

    Das wäre aber recht einfach durch eine Ersetzung des +-Zeichens durch ein |-Zeichen (binäres Oder) behoben:

    newSign |= followingByte1;
    

    worauf beziehst du dich?



  • Darauf, ob wie es mit signed und unsigned (chars|ints) funktioniert. | ist doch für beide gleich, oder?!


  • Mod

    .filmor schrieb:

    Darauf, ob wie es mit signed und unsigned (chars|ints) funktioniert. | ist doch für beide gleich, oder?!

    nein. | arbeitet (ebenso wie +-*/&^usw.) nicht mit kleinen integer typen. falls ein operand ein kleinerer integer-typ ist, findet immer zunächst integrale promotion statt - und die ist wert-bewahrend; negative zahlen bleiben negativ. also

    newSign |= followingByte1; // ist identisch zu newSign |= (int)followingByte1;
    

    selbst wenn newSign unsigned ist, ist entscheidend, ob char ursprünglich vorzeichenbehaftet ist oder nicht (denn das ergebnis ist dann entsprechend 4.7/2 der ursprüngliche wert modulo 2^n)



  • .filmor schrieb:

    Von UTF-8 gibts keine Big- und Little-Endian Varianten, diese Kodierung ist genau und eindeutig definiert (siehe Wikipedia).

    aber utf32 ist multibyte. und dahin geht die konvertierung.

    achja, vergessen: die vorzeichendiskussion tut hier nix zur sache 😉 alles unsigned.


  • Mod

    otze schrieb:

    .filmor schrieb:

    Von UTF-8 gibts keine Big- und Little-Endian Varianten, diese Kodierung ist genau und eindeutig definiert (siehe Wikipedia).

    aber utf32 ist multibyte. und dahin geht die konvertierung.

    achja, vergessen: die vorzeichendiskussion tut hier nix zur sache 😉 alles unsigned.

    dann ist alles gesagt. der wert newSign ist stets derselbe (vorausgesetzt, int ist groß genug). der inhalt von

    reinterpret_cast<char(&)[sizeof newSign]>(newSign);
    

    hängt aber nat. von der architektur ab.


Anmelden zum Antworten