2012-08-16 19 views
11

wenn ich den folgenden Code:Zeigt ein Zeiger auf das LSB oder MSB?

int i = 5; 
void * ptr = &i; 
printf("%p", ptr); 

Will ich die LSB-Adresse i, oder das MSB bekommen?
Wird es sich zwischen den Plattformen anders verhalten?
Gibt es einen Unterschied zwischen C und C++?

+5

Es ist ** nicht definiertes Verhalten **. Die einzige Möglichkeit, 'ptr' zu drucken, ist mit'% p' oder durch Umwandlung in 'intptr_t' und Verwendung des entsprechenden Druckformatierungsmakros. –

+1

Geht es nicht um Endianness? –

Antwort

15

Betrachten der Größe int 4 Bytes ist. Immer &i gibt Ihnen die erste Adresse dieser 4 Bytes.

Wenn die Architektur Little Endian ist, dann hat die untere Adresse das LSB wie unten.

 
     +------+------+------+------+ 
Address | 1000 | 1001 | 1002 | 1003 | 
     +------+------+------+------+ 
Value | 5 | 0 | 0 | 0 | 
     +------+------+------+------+ 

Wenn die Architektur Big Endian ist, dann wird die untere Adresse das MSB wie unten haben.

 
     +------+------+------+------+ 
Address | 1000 | 1001 | 1002 | 1003 | 
     +------+------+------+------+ 
Value | 0 | 0 | 0 | 5 | 
     +------+------+------+------+ 

So wird &i geben LSB-Adresse des i wenn Little-Endian oder es gibt MSB-Adresse des i wenn Big-Endian-

In gemischten Endian-Modus auch, entweder wenig oder Big-Endian wird für jede Aufgabe ausgewählt werden dynamisch.

Below 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 sowohl gleich sein für c und c++

8

Erhalte ich die LSB-Adresse von i, oder das MSB?

Dies ist plattformabhängig: es wird die niedrigste adressierte Byte, die MSB oder LSB abhängig sein kann für ihre Plattform auf endianness.

Obwohl dies nicht direkt in dem Standard geschrieben ist, ist es das, was durch den Abschnitt impliziert ist 6.3.2.3.7:

Wenn ein Zeiger auf ein Objekt in einen Zeiger auf einen Zeichentyp umgewandelt wird, das Ergebnis zeigt auf das niedrigste adressierte Byte des Objekts.


Wird es anders zwischen Plattformen handeln?

Ja


Gibt es einen Unterschied hier zwischen C und C++?

No: es ist plattformabhängig in C und C++

+0

Obwohl ich fast sicher bin, dass das richtig ist - können Sie bitte eine Referenz für diese Ansprüche angeben? – amit

+0

@amit Ich habe keine direkte Bestätigung gefunden, aber der Standard sagt "das niedrigste adressierte Byte" in dem Abschnitt, in dem es um Umwandlung in 'char' Zeiger geht. – dasblinkenlight

+0

Danke für Ihre Mühe trotzdem. – amit

5

ptr speichert die Adresse des Startbyte des Integer-Objekt. Ob dies der Fall ist, in dem das niedrigste oder das höchstwertige Byte gespeichert ist, hängt von Ihrer Plattform ab. Einige seltsame Plattformen verwenden sogar gemischte Endianz, in welchem ​​Fall es weder das MSB noch das LSB ist.

In dieser Hinsicht gibt es keinen Unterschied zwischen C und C++.

8

Es hängt von der Endianess 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, wird es auf das MSB verweisen. Es gibt sogar einige Misch-Endian-Plattformen, in diesem Fall möge Gott deiner Seele gnädig sein überprüfe die spezifische Dokumentation deines Compilers/CPU.

Dennoch können Sie eine schnelle Überprüfung zur Laufzeit 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"); 

By the way, Zeiger drucken müssen Sie die %p Platzhalter verwenden, nicht %d.

+0

Bitte klären Sie meine kleinen Zweifel. Nach meinem Wissen wird das Mixed-Endian-System für jede Aufgabe entweder Little oder Big Endian wählen. Bitte sagen Sie mir, was Sie sonst noch in Ihrem Programm verwenden. Ob mein Verständnis über Mixed Endian falsch ist? – rashok

+0

"Mixed Endian" ist ein Sammelbegriff für Architekturen, bei denen die Bytereihenfolge nicht der kanonische Big-Endian oder Little-Endian ist (siehe Wikipedia für einige Beispiele); Mein Code überprüft einfach, ob die Speicherrepräsentation dieser 32-Bit-Ganzzahl mit der für Big-Endian- oder Little-Endian-Systeme erwarteten übereinstimmt. Wenn sie nicht übereinstimmt, wird sie nicht weiter untersucht und nur als gemischter Endian bezeichnet. –

3

Was es zeigt, ist MSB für meine VC++ 2010 und Digital Mars. Aber es ist verwandt mit Endianess.

Die Antworten dieser Frage geben Ihnen einige Informationen: Detecting endianness programmatically in a C++ program.

Hier Benutzer "none", sagt:

#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); 
} 

Dieses etwas endianness Info

1

gut erhalte ich die LSB-Adresse i, oder das MSB gibt?

Es hängt von der Maschine und dem Betriebssystem ab. Auf großen Endian-Maschinen und Betriebssystemen erhalten Sie das MSB und auf kleinen Endian-Maschinen und Betriebssystemen erhalten Sie das LSB.

Windows ist immer Little Endian. Alle (meisten?) Varianten von Linux/Unix auf x86 sind Little Endian. Linux/Unix auf Motorola Maschinen ist Big Endian. Mac OS auf x86-Rechnern ist Little Endian. Auf PowerPC-Rechnern ist Big Endian.

gut es anders zwischen Plattformen handeln? Ja wird es.

Gibt es hier einen Unterschied zwischen C und C++? Wahrscheinlich nicht.

Verwandte Themen