Forum: Mikrocontroller und Digitale Elektronik Big Endian / Little Endian


von Jantscher (technikp)


Lesenswert?

Hallo, mich plagt eine Verständnisfrage:
Wenn ich auf einem Rechner mit Big Endian die Dezimalzahl 5000 als 
16-bit Zahl speichere und diese dann direkt aus dem Speicher auf einen 
Rechner mit Little Endian überspiele, und nichts geordnet bzw. 
umgeschrieben wurde. Was gibt der Rechner dann mit Little Endian aus?

Muss man zuallererst die Dezimalzahl 5000 als 16bit Dualzahl darstellen, 
oder kann man es auch als Dezimalzahl lassen?

von Achim M. (minifloat)


Lesenswert?

Pat ". schrieb:
> Was gibt der Rechner dann mit Little Endian aus?

34835

Pat ". schrieb:
> Muss man zuallererst die Dezimalzahl 5000 als 16bit Dualzahl darstellen,

Ja

von Jantscher (technikp)


Lesenswert?

Danke, werde das mal versuchen nachzuvollziehen.

von Mic ". (mic1)


Lesenswert?

Was wäre wenn man eine Zeichenkette: "MIKR" bei einem Big-Endian Format 
Rechner hat und diese dann ohne Umordnung in einem Little Endian Rechner 
ausgibt?
Da würde dann: "IMRK" rauskommen oder?

von Bernd (Gast)


Lesenswert?

Nein, Zeichenketten werden immer mit aufsteigender Adresse gespeichert.
Bernd

von Mic ". (mic1)


Lesenswert?

Little Endian :
M  I
K  R
-> "MIKR"


Big Endian :
-> "IMRK"

So hätte ich mir das gedacht...

Ist das nicht das gleiche Prinzip, wie bei Dezimalzahl 5000 als Dualzahl 
Ursprungsfrage, da gilt ja auch:
5000 =  | 0001 0011 | 1000 1000 | als Big Endian.

in Little Endian ausgelesen, dann: 1000 1000 0001 0011 = 34835 in dez.

von A. S. (Gast)


Lesenswert?

Endian gilt nur und ausschließlich für einen Basistyp

Char: egal, weil nur 1 Byte
16 Bit (z.b. short) Bytes vertauscht
32 Bit (z.b. long) 4 Bytes umgedreht

64 Bit (z.b. Double) ...

Arrays oder Strukturen werden nicht gedreht, nur jeder Basistyp darin.

Bei bitfeldern ist das analog, führt hier jetzt aber zu weit.

Ein String ist ein Array von char. Darum nicht drehen. Hast Du wide 
Strings (z.b. utf-16) dann wird jedes Zeichen in sich gedreht.

von Mic ". (mic1)


Lesenswert?

Oke ja aber dann dürfte das mit Dezimalzahl 5000 eh passen, oder?

Da haben wir ja 2 Byte: 5000 dez. = 00010011 10001000

Im Big Endian Format also : 00010011 10001000

Im Little Endian Format: 10001000 00010011 = 2^15 + 2^11 + 2^4 + 2^1 + 
2^0= 34835

Hier wird ja auch nur die BYTEplatzierung vertauscht und nicht die 
BITplatzierung.

von Klugscheisser (Gast)


Lesenswert?

Nimm einfach eine CPU die zur Laufzeit die Endianess wechseln kann,
z.B. aus der Renesas SH-3 Reihe.

von my2ct (Gast)


Lesenswert?

Pat ". schrieb:
> 16-bit Zahl ...
> Was gibt der Rechner dann mit Little Endian aus?

signed oder unsigned?
-30701 bzw. 34835

von c-hater (Gast)


Lesenswert?

Klugscheisser schrieb:

> Nimm einfach eine CPU die zur Laufzeit die Endianess wechseln kann,
> z.B. aus der Renesas SH-3 Reihe.

Auch wieder so ein Feature aus der "Braucht kein Mensch"-Klasse.

Also echt: wozu, um alles in der Welt, soll das denn gut sein?

von A. S. (Gast)


Lesenswert?

c-hater schrieb:
> wozu, um alles in der Welt, soll das denn gut sein?

Also das ist ganz praktisch: wenn man versehentlich zweimal gedreht hat, 
kann man damit erneut drehen. Dann passt es in 50% der Fälle.

von Mic ". (mic1)


Lesenswert?

Danke für die zahlreichen Kommentare. Zum Thema signed oder unsigned, 
was da genau gefragt war, weiß ich jetzt nicht mehr. Aber das Prinzip 
ist ja das selbe bezüglich "Endianess".

Zur Zeichenkettefrage wie würdet ihr das handhaben? So wie 
ich?(zitierter Beitrag)

Mic ". schrieb:
> Was wäre wenn man eine Zeichenkette: "MIKR" bei einem Big-Endian Format
> Rechner hat und diese dann ohne Umordnung in einem Little Endian Rechner
> ausgibt?
> Da würde dann: "IMRK" rauskommen oder?

von Ozvald K (Gast)


Lesenswert?

Mic ". schrieb:
> Zur Zeichenkettefrage wie würdet ihr das handhaben? So wie
> ich?(zitierter Beitrag)

Zeichenkette bleibt wie sie ist. Dort musst du nichts umdrehen.
"Test" bleibt "Test".

von Rainer V. (a_zip)


Lesenswert?

Rechner hört sich für mich jetzt nach PC an und wenn du da quasi einen 
Speicher-Dump holst und weiterverarbeiten willst, dann mußt du natürlich 
wissen, wie der Speicher organisiert ist. Das kriegt man dann aber mit 
ein paar einfachen Test-Pattern raus. Wenn du Controller meinst, dann 
bist du ja selbst dafür verantwortlich, wie dein Speicher organisiert 
ist. Bei Hochsprachen kenn ich mich nicht so aus, denke aber, dass das 
erst mal nicht wichtig ist, es sei denn, du willst explizit ein 
bestimmtes "Format" im Speicher haben. Ich kenne das aus der 
hardwarenahen Verarbeitung von WAV-Dateien. Dort mußt du natürlich 
wissen, wie deine Daten-Bytes abgelegt werden/wurden. Auf der höheren 
Ebene, z.B. in Python, kannst du das Format einfach vorgeben. In 
Assembler schaut man z.B. wie der Programmcounter im Ram abgelegt wird 
und es ist dann eine gute Idee, das bei eigenen Speicheroperationen 
genau so zu machen. Du schreibst also zuerst immer das High-Byte und 
dann das Low-Byte...beim Lesen machst du es umgekehrt...und hast damit 
keine Probleme (oder Schlimmeres). Und natürlich kann man die 
Vertauschung im Dezimalsystem auch machen, im Binärsysten mit Bytes ist 
es m.A. aber deutlich klarer.
Gruß Rainer

von Jantscher (technikp)


Lesenswert?

Mic ". schrieb:
> Was wäre wenn man eine Zeichenkette: "MIKR" bei einem Big-Endian Format
> Rechner hat und diese dann ohne Umordnung in einem Little Endian Rechner
> ausgibt?
> Da würde dann: "IMRK" rauskommen oder?

Ja, ich denke das past.

Anordnung bei Big- Endian:

0|M  I|1
2|K  R|3

die Zahlen vor dem Buchstaben stehen für die Adresse.

OHNE UMORDNUNG an Little Endian Rechner ausgegeben :
1|M  I|0
3|K  R|2
also der Reihenfolge nach 0,1,2,3 -> IMRK

So finde ich auch das, dies richtig ist. Warum sollte sich dort auch 
nichts ändern??

von Yalu X. (yalu) (Moderator)


Lesenswert?

Pat ". schrieb:
> Anordnung bei Big- Endian:
>
> 0|M  I|1
> 2|K  R|3
>
> die Zahlen vor dem Buchstaben stehen für die Adresse.

Richtig.

> OHNE UMORDNUNG an Little Endian Rechner ausgegeben :
> 1|M  I|0
> 3|K  R|2

Wieso OHNE UMORDNUNG? Du hast die Bytes doch gerade umgeordnet: An
Adresse 0, wo vorher ein 'M' stand, steht jetzt ein 'I', an Adresse 1
hast du das 'I' durch ein 'M' ersetzt usw.

Aber genau diese Umordnung findet eben nicht statt. Sowohl bei little
als auch bei big Endian werden die Elemente eines Byte-Arrays in ihrer
natürlichen Reihenfolge im Speicher abgelegt:

1
Adresse  Inhalt
2
───────────────
3
   0      'M'
4
   1      'I'
5
   2      'K'
6
   3      'R'
7
───────────────

Wäre dies nicht so, dann könnte man nicht einfach in einer Schleife mit
aufsteigendem Index über die Elemente des Arrays iterieren:

1
  char s[] = "MIKR";
2
  for (int i=0; i<4; i++)
3
    putchar(s[i]);
4
5
  // Ausgabe: MIKR

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Wenn man aber eine Union aus 1 long und 4 chars macht, und diese 
"Zeichen" dann tatsächlich wie einen kleinen "String" behandelt und mit 
binären "Zeichen" aus z.B. der seriellen Schnitte füllt, dann kann es 
schon mal sein, dass man verdutzt aus der Wäsche guckt...

von Ozvald K. (Gast)


Lesenswert?

Pat ". schrieb:
> So finde ich auch das, dies richtig ist. Warum sollte sich dort auch
> nichts ändern??

Zu meinem Job gehört unter anderem Daten von Siemens SPS Steuerungen 
(big endian) mit PC aus zu lesen (little endian) um in SQL Datenbank zu 
schreiben. Ein bisschen Erfahrung dürfte ich dabei gesammelt haben.

Aber du kannst es einfach ausprobieren und hier berichten ob das, was du 
für richtig hältst, auch wirklich so stimmt.

von (prx) A. K. (prx)


Lesenswert?

Yalu X. schrieb:
> Wäre dies nicht so, dann könnte man nicht einfach in einer Schleife mit
> aufsteigendem Index über die Elemente des Arrays iterieren:

Man nehme einen Prozessor, der Bytes big endian adressiert, Bits aber 
little endian. In dem man also mit Bytebefehlen Byte-Arrays im Speicher 
direkt adressiern kann, 4 Mrd Bytes am Stück. Und in dem man mit 
Einzelbitbefehlen Bit-Arrays im Speicher direkt adressieren kann. 4 Mrd 
Bits am Stück.

Und nun füge man in der nächsten grösseren Architekturrevision Befehle 
für Bitfelder hinzu. Und überlege sich, wie man diese Bitfelder 
adressiert, wenn sie über Bytegrenzen gehen können. Also beispielsweise 
ein dicht gepacktes Array aus 5 Bit breiten Feldern.

Wenn man sich das aufmalt und die Operationen durchspielt, wird man 
feststellen, dass die little endian Bitnummerierung der ersten 
Architektur ein Schuss in Knie war, und man für die Bitfelder auf big 
endian umsteigen muss.

Das Ergebnis war nun eine Architektur mit big endian Byteorder, little 
endian Bitorder und big endian Bitfields. In Silizium verewigte Dummheit 
könnte man das nennen.

So geschehen bei 68000 und 68020.

Vergleichweise harmlos war dagegen die PDP-11. Bei der waren die Bytes 
little endian, aber 32-Bit Worte hatten im Speicher das höherwertige 
16-Bit Wort vorneweg. Launisch auch als middle endian bezeichnet. 
Netterweise machte es die (weniger bekannte) Konkurrenz von Honeywell 
genau umgekehrt.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Pat ". schrieb:
> Muss man zuallererst die Dezimalzahl 5000 als 16bit Dualzahl darstellen,
> oder kann man es auch als Dezimalzahl lassen?

Du kannst sie so lassen, weil beides das gleiche ist. Ein Assembler oder 
Compiler legt eine Zahl immer binär ab, weil die CPU nur binär rechnen 
kann.
Für das Rechnen in packed BCD braucht es spezielle Bibliotheken.

von Jantscher (technikp)


Lesenswert?

Ja aber die Frage ist doch:
Speicher eines Rechners mit Big Endian Format enthält Zeichenkette 
"MIKR". Dieser Speicherinhalt wird Byte für Byte in Datei abgespeichert, 
und diese Datei wird auf einem Rechner mit Little Endian Format Byte für 
Byte am Bildschirm ausgegeben.
Was wird am Bildschirm anezeigt?

Das es in der Prais nicht IMRK ausgegeben wird, ist sicherlich so aber 
hier bei der Frage geht es doch eher darum das man versteht das die 
Adressierungen bei Big Endian und Little Endian vertauscht sind, oder?

von (prx) A. K. (prx)


Lesenswert?

Pat ". schrieb:
> Was wird am Bildschirm anezeigt?

Genau das gleiche. Wenn man es byteweise anzeigt. Interessant wird es 
erst, wenn man es nicht byteweise darstellt, sondern beispielsweise in 
16-Bit Gruppen.

Wer Linux oder Windows Unix-Tools in Reichweite hat, der kann das mit
  od -c file    (8 Bit Zeichen)
  od -x file    (8-Bit Hex)
  od -tx2 file  (16-Bit Hex)
  od -tx4 file  (32-Bit Hex)
mit einem File durchprobieren, das als Inhalt "ABCD" enthält.

Das ist bei little endian Maschinencode ein durchaus realen Problem, 
wenn der nicht wie bei RISC in festen Worten codiert ist, sondern als 
Bytestream. Was bei der VAX dazu führte, dass deren Assembler im Listing 
die erzeugten Bytes von rechts nach links anordnete, damit man die darin 
enthaltene Konstanten noch wiederfand, ohne sich das Hirn zu verrenken.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Pat ". schrieb:
> Speicher eines Rechners mit Big Endian Format enthält Zeichenkette
> "MIKR".

Die Order spielt nur eine Rolle, wenn Du Zahlen 16Bittig ablegst aber 
8Bittig ausliest.
Bei Text ist die Order schnurz, da Lesen und Schreiben immer in der 
selben Breite erfolgt (ANSI bzw. Unicode).

von c-hater (Gast)


Lesenswert?

Peter D. schrieb:

> Die Order spielt nur eine Rolle, wenn Du Zahlen 16Bittig ablegst aber
> 8Bittig ausliest.
> Bei Text ist die Order schnurz, da Lesen und Schreiben immer in der
> selben Breite erfolgt (ANSI bzw. Unicode).

Das ist nicht ganz korrekt, denn es gibt Unicode-Codierungen, die mit 
16bittigen Zahlen arbeiten. Dann spielt es eine Rolle. Und weil das so 
ist, gibt es dann auch den Unicode-BOM (byte order marker).

von Matthias L. (Gast)


Lesenswert?

>direkt aus dem Speicher auf einen Rechner mit Little Endian überspiele,

Aus meiner Sicht ist das ein Fehler. Wenn Du quasi ein Protokoll für den 
Datenaustausch baust, dann würde ich das explizit selbst tun. Ich finde 
es falsch, einfach per memcpy irgendwelche plain Daten oder 
Bausteinabbilder in den Sendepuffer einer Kommunikation zum Versenden zu 
kopieren.

Ich würde das hier entweder in Strings umwandeln und als String
"Speed=5000" übertragen, oder ein binäres Protokoll selbst bauen. Dann 
hast Du das selbst im Griff. Musst es aber selbst vorbereiten...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.