Forum: Compiler & IDEs Endianess und typecast


von Endianer (Gast)


Lesenswert?

Hallo,

ich verwirre mich gerade mit big/little endianess und typecasts.

Ich beziehe mich auf diese Darstellung
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/I1835.html

Wenn ich eine little-endian-Maschine habe, steht LSB bis LSB+7 an 
Adresse 0. Bei einer big-endian-Maschine steht MSB-7 bis MSB and Adresse 
0 (Bitorder innerhalb der Bytes mal unbeachtet).

Mache ich folgendes
1
uint32_t a  = 0x01020304;
2
uint8_t b   = (uint8_t)a;
3
uint8_t * c = &a;

ist b dann sowohl bei einer little- als auch big-endian-Maschine 0x04? 
D.h. bei einer little-endian-Maschine nimmt der Compiler das Byte an 
Adresse 0 und bei einer big-endian-Maschine das Byte an Adresse 3 für 
diesen Cast?
Für *c bekomme ich wahrscheinlich 0x04 auf einer little-endian- und 0x01 
auf einer big-endian-Maschine?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hast Du keinen C-Compiler?

$ cat a.c
1
#include <stdio.h>
2
#include <stdint.h>
3
4
int main ()
5
{
6
    uint32_t a  = 0x01020304;
7
    uint8_t b   = (uint8_t)a;
8
    uint8_t * c = (uint8_t *) &a;   // cast hinzugefuegt
9
10
    printf ("%d %d %d\n", a, b, *c);
11
    return 0;
12
}
$ cc -Wall a.c && ./a.out
16909060 4 4

Übersetzt auf einer Little-Endian-Maschine (Linux).

P.S.
Deine Überlegungen sind alle richtig. b ist auf einer 
Big-Endian-Maschine identisch, *c jedoch nicht.

von Klaus W. (mfgkw)


Lesenswert?

Endianer schrieb:
> ist b dann sowohl bei einer little- als auch big-endian-Maschine 0x04?
> D.h. bei einer little-endian-Maschine nimmt der Compiler das Byte an
> Adresse 0 und bei einer big-endian-Maschine das Byte an Adresse 3 für
> diesen Cast?

ja

> Für *c bekomme ich wahrscheinlich 0x04 auf einer little-endian- und 0x01
> auf einer big-endian-Maschine?

ja (ggf. noch ein cast nötig)

von Endianer (Gast)


Lesenswert?

Danke! Hat mir geholfen!

von Klaus W. (mfgkw)


Lesenswert?

Bitte.

Aber nur der Vollständigkeit halber: es gab auch mal Rechner (PDP-...), 
die noch eine andere Variante hatten.
Da waren die zwei Bytes innerhalb eines Byte-Paares LE, dagegen die 
beiden Paare eines 4-Byte-Wertes BE zueinander.

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.