Zeigt ein Zeiger auf LSB oder MSB?

Lesezeit: 4 Minuten

Benutzeravatar von elyashiv
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++?

  • Es ist undefiniertes Verhalten. Die einzige Möglichkeit zu drucken ptr ist mit %poder durch Konvertieren in intptr_t und mit dem entsprechenden Makro zur Druckformatierung.

    – Kerrek SB

    16. August 2012 um 10:41 Uhr


Benutzeravatar von rashok
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++

Benutzeravatar von Sergey Kalinichenko
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

Benutzeravatar von Matteo Italia
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++.

Benutzeravatar von huseyin tugrul buyukisik
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

Benutzeravatar von Kirt Undercoffer
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.

1444100cookie-checkZeigt ein Zeiger auf LSB oder MSB?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy