Forum: Mikrocontroller und Digitale Elektronik Little Endian


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Maren K. (maren_knappig)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich habe ein grundlegendes Verständnissproblem, welches ich auch nach 
Suche im Forum nicht lösen konnte.

Es geht darum, wie Daten im Speicher abgelegt werden. Wenn ich bspw. 
Daten im Little-, big oder mixed-Endian abspeicher wie genau geschieht 
das?

Wenn z.B. folgende Hexadezimalzahlen im 4Byte Speicher (auf Adresse 
0001(Hexa) bis 0003(Hexa) ) abgelegt habe:

20 (Hexa)
32 (Hexa)
7A (Hexa)
C8 (Hexa)

bedeutet das ich habe folgende Zahl gespeichert:

20327AC8 (Hexa) = 540179144 (Dezimal) = 100000001100100111101011001000 
(Binär)?

Ist das denn im little endian gespeichert, weil das niederwertigste byte 
auf der niederwertigsten Adresse gespeichert wurde und was bedeutet das 
genau? Bedeutet niederwertigstes Byte, dass man die Zahl in Bytes 
aufteilt (bei Hex zwei ziffern pro Byte entsprechend der reihenfolge) 
und dann mit der niederwertigsten adresse (also geringsten "Zahl") 
beginnt und dann aufsteigen speichert?

Wenn ich die Zahlen jetzt z.B. in einer anderen Reihenfolge abgelegt 
habe z.B.

32 (Hexa) --> 50 (Dezimal)
20 (Hexa) --> 32 (Dezimal)
7A (Hexa) --> 122 (Dezimal)
C8 (Hexa)--> 200 (Dezimal)

Dann ist es doch kein Little Endian Format mehr, da 32 (Hexa) auf 
Adresse 0000(Hexa) gespeichert ist und 32 in dem falle nur die 
zweiwertige Byte ist und 0000 die niederwertigste adresse, oder?


Wenn ja was passiert danach?
Muss man die Hexa zahlen nun in Dualzahlen umrechnen und diese 
entsprechend der reihenfolge bitweise speichern, wobei das erste bit das 
Sign bit ist, dann die exponenten bits und dann kommen die Mantissen?

von Michael R. (mr-action)


Bewertung
-1 lesenswert
nicht lesenswert
Du bist vollkommen neben der Spur...

Du hast eine Zahl, z.B. 305419896. Das entspricht 0x12345678.

Big Endian: 0x12345678
Little Endian: 0x78563412

Das ist alles.

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Das wird eigentlich hier
https://en.wikipedia.org/wiki/Endianness#Big
gar nicht so schlecht erklärt.

von Niklas G. (erlkoenig) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Maren K. schrieb:
> bedeutet das ich habe folgende Zahl gespeichert:
>
> 20327AC8 (Hexa) = 540179144 (Dezimal) = 100000001100100111101011001000
> (Binär)?

Das kommt eben darauf an, wie du diese 4 Bytes interpretierst. 20327AC8 
wäre die Big Endian-Interpretation.

Maren K. schrieb:
> Ist das denn im little endian gespeichert, weil das niederwertigste byte
> auf der niederwertigsten Adresse gespeichert wurde und was bedeutet das
> genau?
Du hast das höchstwertigste Byte an der niedrigsten Adresse gespeichert! 
Die Ziffer ganz links (2) in der normalen Hex-Darstellung hat den 
höchsten Wert (16^7=268435456).

Maren K. schrieb:
> Dann ist es doch kein Little Endian Format mehr,

Den Bytes an sich kann man nicht ansehen, welches Format das ist. Wenn 
du die Zahl 20327AC8 so ablegst, wäre das eine sehr unübliche 
Reihenfolge, die m.W. keinen bestimmten Namen ("xxx Endian") hat.

Maren K. schrieb:
> Muss man die Hexa zahlen nun in Dualzahlen umrechnen

Du musst gar nix, wenn man nicht weiß wozu :-)

Maren K. schrieb:
> dann die exponenten bits und dann kommen die Mantissen?
Plötzlich geht es um Floating-Point? Da ist eh alles anders.

von Purzel H. (hacky)


Bewertung
0 lesenswert
nicht lesenswert
Die Gedanken sind korrekt. Die Byte Reihenefolge wird benoetigt wenn 
zusammengesetzte Bytes interpretiert werden muessen. Wenn man ein 
(un)signed 16 oder 32 bit, einzeln angefasst werden muessen. Bei 
Rechnungen muss man das in der Regeln nicht, der compiler macht das 
schon richtig. Es wird benoetigt fuer komminikationsapplikationen. Wenn 
(un)signed 16 oder 32 bit Zahlen ueber UART, oder SPI oder so 
transportiert werden muessen.

Eine Umrechnung von Binaer nach Hex ist nicht noetigt, das ist nur eine 
Interpretationsfrage fuer den Betrachter. Desgleichen Dezimal. Benoetigt 
man nicht. Nur wenn man effektiv eine Zahl auf einem Display darstellen 
will.

von Luther B. (luther-blissett)


Bewertung
0 lesenswert
nicht lesenswert
Maren K. schrieb:

> Wenn z.B. folgende Hexadezimalzahlen im 4Byte Speicher (auf Adresse
> 0001(Hexa) bis 0003(Hexa) ) abgelegt habe:
>
> 20 (Hexa)
> 32 (Hexa)
> 7A (Hexa)
> C8 (Hexa)

Dann hast du im Little Endian die 32-Bit Zahl
C87A3220

- oder -

die beiden 16 Bit Zahlen 3220 und C87A gespeichert.

in Big Endian hast die die 32-Bit Zahl

20327AC8

- oder -

die beiden 16 Bit Zahlen

2032 und 7AC8

gespeichert.

Übrigens: wir benutzten im Westen Big Endian für Zahlen, da in z.B. 
"2018" mit der grössten Stelle angefangen wird. Im Arabischen tauchte 
diese Zahl dagegen im Schriftbild zwar genauso auf, würde aber von 
rechts nach links gelesen! Daher Arabisch=Little Endian!

von Karl B. (gustav)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
auf Seite 12 und 13 wird darauf eingegangen.

Dasselbe Dokument ist mit anderem Inhalt jetzt im Netz, da fehlt das.

Habe noch das alte gefunden.
Da fängt es an:
Zitat
"...To  help  understand  the  difference  between  Big  and  Little 
Endian let's take  a  closer  look  at how  data  is stored in Flash 
Program Memory..."
"...Wait  a  minute - that looks backward.
From reading about the .DB assembly directive can you discover why?..."
/zitat


ciao
gustav

: Bearbeitet durch User
von Maren K. (maren_knappig)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Wäre es so wie ich es mir zusammengereimt habe (Anhang) richtig?

von Niklas G. (erlkoenig) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Wenn du wie beschrieben C8, also das an Adresse 3 (ich denke mal die 4 
ist ein Tippfehler) gespeicherte Byte als Höchstwertigstes auffasst, 
wäre das Little Endian, und die Zahl lautet C87A3220.

Die Frage ist nun noch was du mit "Byte 1"... "Byte 4" meinst; diese 
Nummerierung läuft entgegen der Adresse?

von georg (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Maren K. schrieb:
> Wenn ich bspw.
> Daten im Little-, big oder mixed-Endian abspeicher

Wen du das tust - was in der Praxis eher selten der Fall ist, denn schon 
die einfachsten Prozessoren haben Lade/Speicherbefehle für 16 
Bit-Integer oder mehr, und da ist die Frage, wie der Prozessor selbst 
die Zahlen im Speicher ablegt. 8080/Z80/8086 benutzen von sich aus 
Little Endian oder anders gesagt LSB first. Wenn man den Speicherinhalt 
mit einem Hex-Editor betrachtet, stehen daher längere Zahlen sozusagen 
verkehrt herum in der Anzeige, aber daran gewöhnt man sich wenn man auf 
Assembler-Ebene arbeitet. Als Programmierer hat man mit dem Problem nur 
zu tun wenn man die Bytes einer Zahl einzeln bearbeitet, also wenn man 
z.B. die Bytes eines 16-bit-Registers einzeln lädt mit LD H,nn und LD 
L,nn. Nimmt man gleich einen 16bit-Befehl wie LD HL,nnnn macht der 
Prozessor das automatisch richtig, das gleiche gilt unabhängig von der 
Assemblerversion für einen C-Compiler.

Probleme treten auf wenn man Daten byteweise überträgt, denkt man sich 
z.B. ein Protokoll für serielle Schnittstellen aus, so muss man auch 
festlegen, wie Zahlen aus mehreren Bytes übertragen werden. Einfacher 
und besser prüfbar ist es, Zahlen in ASCII-Darstellung zu übertragen, 
Funktionenpaare wie printf / scanf interpretieren die Zahlenwerte dann 
schon richtig (wobei eine lesbare Zahl Big Endian ist, das MSB kommt 
zuerst).

Ist mit der Zeit Routine, als 8086-Programmierer liest man grössere 
Integer  bei einer byteweisen Anzeige schon automatisch von rechts nach 
links.

Georg

von c-hater (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Name H. schrieb:

> Die Gedanken sind korrekt. Die Byte Reihenefolge wird benoetigt wenn
> zusammengesetzte Bytes interpretiert werden muessen.

So isses. Fast. Die korrekte Formulierung wäre: "wenn man Wörter korrekt 
interpretieren will, die aus mehr als einem Byte bestehen".

> Eine Umrechnung von Binaer nach Hex ist nicht noetigt, das ist nur eine
> Interpretationsfrage fuer den Betrachter.

So isses. Intern ist alles binär, jedenfalls bei allen heute praktisch 
relevanten Rechenknechten.

von Baku M. (baku)


Bewertung
0 lesenswert
nicht lesenswert
Luther B. schrieb:
>[...]
> Übrigens: wir benutzten im Westen Big Endian für Zahlen, da in z.B.
> "2018" mit der grössten Stelle angefangen wird. Im Arabischen tauchte
> diese Zahl dagegen im Schriftbild zwar genauso auf, würde aber von
> rechts nach links gelesen! Daher Arabisch=Little Endian!

Onsen!
Im arabischen wird zwar der Text von rechts nach links geschrieben, 
Zahlen aber, wie bei uns, auch wenn sie innerhalb des Textes stehen, von 
links nach rechts mit genau derselben Wertigkeit der Stellen.
(Macht übrigens die Programmierung von Eingabefeldern für Arabisch noch 
ein wenig schlimmer, als es so schon ist. Btdt...)

Klugscheisst
Baku

von M. H. (bambel2)


Bewertung
0 lesenswert
nicht lesenswert
Baku M. schrieb:
> Onsen!

Ich mag Onsen.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Bist Du wirklich sicher, dass es sich bei Deinen Zahlen um 
Fließkommazahlen mit einfacher Genauigkeit gemäß IEEE 754 handelt?

Normale positive Zahlen (unsigned) werden "ganz normal" durchgezählt von 
0 bis (2^32)-1; vorzeichenbehaftete (signed) werden durchgezählt von 
-(2^31) bis (2^31)-1, d.h. im Zweierkomplement. Ein Exponent wird da 
überhaupt nicht benötigt.

Ein Sonderfall wäre noch die Einerkomplementdarstellung, wie sie z.B. 
für manche Prüfsummen oder kryptografische Zwecke benötigt wird.

Ist es eigentlich Zufall, dass die Werte Deiner vier Bytes aufsteigend 
bzw. absteigend sind? Verwechselst Du die Position des jeweiligen Bytes 
womöglich mit dessen Inhalt? Die Bytes dürfen natürlich niemals nach den 
Inhalten sortiert werden!

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Andreas S. schrieb:
> Bist Du wirklich sicher, dass es sich bei Deinen Zahlen um
> Fließkommazahlen mit einfacher Genauigkeit gemäß IEEE 754 handelt?

Wo hat das jemand behauptet?

von Der Andere (Gast)


Bewertung
0 lesenswert
nicht lesenswert
georg schrieb:
> oder anders gesagt LSB first

Stop! LSB ist per definitiones Lowest significant BIT! nicht Byte.

Es wird aber Byteweise abgespeichert. Dieser Teilsatz ist also falsch!

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> Andreas S. schrieb:
>> Bist Du wirklich sicher, dass es sich bei Deinen Zahlen um
>> Fließkommazahlen mit einfacher Genauigkeit gemäß IEEE 754 handelt?
>
> Wo hat das jemand behauptet?

Maren K. schrieb:
> wobei das erste bit das
> Sign bit ist, dann die exponenten bits und dann kommen die Mantissen?

Außerdem hat Maren in dem Bildchen die Bits mit s, e7 bis e0, m23 bis m0 
bezeichnet. Das wäre typisch für IEEE 754 mit einfacher Genauigkeit.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Der Andere schrieb:
> Stop! LSB ist per definitiones Lowest significant BIT! nicht Byte.
>
> Es wird aber Byteweise abgespeichert. Dieser Teilsatz ist also falsch!

Nein, um Verwirrung zu stiften, wird die Abkürzung LSB sehr häufig auch 
für Least Significant BYTE verwendet. Besser wäre natürlich LSO (Least 
Significant Octet), also typischer ETSI-Sprech.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.