wenn ich folgenden Code habe:
int i = 5;
void * ptr = &i;
printf("%p", ptr);
Bekomme ich die LSB-Adresse von i oder das MSB?
Wird es sich zwischen den Plattformen unterschiedlich verhalten?
Gibt es hier einen Unterschied zwischen C und C++?
Eljaschiw
wenn ich folgenden Code habe:
int i = 5;
void * ptr = &i;
printf("%p", ptr);
Bekomme ich die LSB-Adresse von i oder das MSB?
Wird es sich zwischen den Plattformen unterschiedlich verhalten?
Gibt es hier einen Unterschied zwischen C und C++?
rashok
Betrachten Sie die Größe von int
ist 4 Byte. Stets &i
gibt Ihnen die erste Adresse dieser 4 Bytes.
Wenn die Architektur Little Endian ist, hat die niedrigere Adresse das LSB wie unten.
+------+------+------+------+ Address | 1000 | 1001 | 1002 | 1003 | +------+------+------+------+ Value | 5 | 0 | 0 | 0 | +------+------+------+------+
Wenn die Architektur Big Endian ist, hat die niedrigere Adresse das MSB wie unten.
+------+------+------+------+ Address | 1000 | 1001 | 1002 | 1003 | +------+------+------+------+ Value | 0 | 0 | 0 | 5 | +------+------+------+------+
So &i
gibt LSB-Adresse von i
Wenn Little Endian oder es MSB-Adresse von gibt i
wenn Big-Endian
Auch im Mixed-Endian-Modus wird für jede Aufgabe dynamisch entweder Little oder Big Endian gewählt.
Die folgende Logik sagt Ihnen die Endianess
int i = 5;
void * ptr = &i;
char * ch = (char *) ptr;
printf("%p", ptr);
if (5 == (*ch))
printf("\nlittle endian\n");
else
printf("\nbig endian\n");
Dieses Verhalten wird für beide gleich sein c
Und c++
Sergej Kalinitschenko
Bekomme ich die LSB-Adresse von i oder das MSB?
Dies ist plattformabhängig: es wird sein das niedrigste adressierte Bytedas je nach Plattform MSB oder LSB sein kann Endianität.
Obwohl dies nicht direkt im Standard geschrieben ist, wird dies durch Abschnitt 6.3.2.3.7 impliziert:
Wenn ein Zeiger auf ein Objekt in einen Zeiger auf einen Zeichentyp umgewandelt wird, zeigt das Ergebnis auf das niedrigste adressierte Byte des Objekts.
Wird es sich zwischen den Plattformen unterschiedlich verhalten?
Ja
Gibt es hier einen Unterschied zwischen c und c++?
Nein: Es ist sowohl in C als auch in C++ plattformabhängig
Obwohl ich mir fast sicher bin, dass dies richtig ist – können Sie bitte eine Referenz für diese Behauptungen angeben?
– amit
16. August 2012 um 10:43 Uhr
@amit Ich habe keine direkte Bestätigung gefunden, aber der Standard sagt “das niedrigste adressierte Byte” in dem Abschnitt, in dem es um die Konvertierung geht char
Zeiger.
– Sergej Kalinitschenko
16. August 2012 um 11:01 Uhr
Danke trotzdem für deine Mühe.
– amit
16. August 2012 um 11:02 Uhr
Dies sollte die akzeptierte Antwort sein :).
– Rick
31. März 2020 um 10:43 Uhr
Matteo Italien
Es hängt von der Endianness der Plattform ab; Wenn es sich um eine Little-Endian-Plattform handelt, erhalten Sie einen Zeiger auf das LSB, wenn es sich um eine Big-Endian-Plattform handelt, zeigt es auf das MSB. In diesem Fall gibt es sogar einige Mixed-Endian-Plattformen Möge Gott deiner Seele gnädig sein Überprüfen Sie die spezifische Dokumentation Ihres Compilers/CPU.
Dennoch können Sie zur Laufzeit eine schnelle Überprüfung durchführen:
uint32_t i=0x01020304;
char le[4]={4, 3, 2, 1};
char be[4]={1, 2, 3, 4};
if(memcmp(&i, le, 4)==0)
puts("Little endian");
else if(memcmp(&i, be, 4)==0)
puts("Big endian");
else
puts("Mixed endian");
Übrigens, um Zeiger zu drucken, müssen Sie die verwenden %p
Platzhalter, nein %d
.
Bitte klären Sie meine kleinen Zweifel. Nach meinem Wissen wählt das gemischte Endian-System für jede Aufgabe entweder Little oder Big Endian. Bitte sagen Sie mir, was die Verwendung von else case in Ihrem Programm ist. Ob mein Verständnis von Mixed Endian falsch ist?
– rashok
17. August 2012 um 10:46 Uhr
“Mixed Endian” ist ein Sammelbegriff für Architekturen, bei denen die Byte-Reihenfolge nicht dem kanonischen Big-Endian oder Little-Endian entspricht (siehe Wikipedia für einige Beispiele); Mein Code prüft einfach, ob die Speicherdarstellung dieser 32-Bit-Ganzzahl mit der erwarteten für Big-Endian- oder Little-Endian-Systeme übereinstimmt. Wenn sie nicht übereinstimmt, untersucht sie nicht weiter und sagt nur, dass es sich um gemischtes Endian handelt.
– Matteo Italien
17. August 2012 um 17:18 Uhr
ptr speichert die Adresse des Startbytes des Integer-Objekts. Ob hier das höchst- oder niederwertigste Byte gespeichert wird, hängt von Ihrer Plattform ab. Einige seltsame Plattformen verwenden sogar Mixed Endianness, in diesem Fall ist es weder das MSB noch das LSB.
In dieser Hinsicht gibt es keinen Unterschied zwischen C und C++.
huseyin tugrul buyukisik
Was es zeigt, ist MSB für mein VC++ 2010 und Digital Mars. Aber es hängt mit der Endianness zusammen.
Die Antworten auf diese Frage geben Ihnen einige Informationen: Endianness programmgesteuert in einem C++-Programm erkennen.
Hier sagt Benutzer “none”:
#define BIG_ENDIAN 0
#define LITTLE_ENDIAN 1
int TestByteOrder()
{
short int word = 0x0001;
char *byte = (char *) &word;
return(byte[0] ? LITTLE_ENDIAN : BIG_ENDIAN);
}
Dies gibt einige Endianness-Informationen
Kirt Undercoffer
Nun, ich bekomme die LSB-Adresse von i oder das MSB?
Es hängt von der Maschine und dem Betriebssystem ab. Auf Big-Endian-Rechnern und -Betriebssystemen erhalten Sie das MSB und auf Little-Endian-Rechnern und -Betriebssystemen erhalten Sie das LSB.
Windows ist immer Little Endian. Alle (die meisten?) Varianten von Linux/Unix auf x86 sind Little Endian. Linux/Unix auf Motorola-Rechnern ist Big Endian. Mac OS auf x86-Rechnern ist Little Endian. Auf PowerPC-Rechnern ist es Big Endian.
Nun, es verhält sich zwischen den Plattformen unterschiedlich? Ja, es wird.
Gibt es hier einen Unterschied zwischen c und c++? Wahrscheinlich nicht.
Es ist undefiniertes Verhalten. Die einzige Möglichkeit zu drucken
ptr
ist mit%p
oder durch Konvertieren inintptr_t
und mit dem entsprechenden Makro zur Druckformatierung.– Kerrek SB
16. August 2012 um 10:41 Uhr