2012-08-16 10 views
11

jeśli mam następujący kod:Czy wskaźnik wskazuje na LSB lub MSB?

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

otrzymam LSB adresu I lub MSB?
Czy będzie działać inaczej między platformami?
Czy jest różnica między C i C++?

+5

To niezdefiniowane zachowanie ** **. Jedynym sposobem na wydrukowanie 'ptr' jest'% p' lub konwersja do 'intptr_t' i użycie odpowiedniego makra do formatowania wydruku. –

+1

Czy nie chodzi o endianizm? –

Odpowiedz

15

rozważyć wielkość int wynosi 4 bajty. Zawsze &i da ci pierwszy adres tych 4 bajtów.

Jeśli architektura jest mało endyńska, wówczas niższy adres będzie miał LSB jak poniżej.

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

Jeśli architektura jest duża endian, to niższy adres będzie miał MSB jak poniżej.

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

Więc &i da LSB adres i jeśli trochę endian czy da MSB adresu i jeśli big endian

W trybie mieszanym endian również, albo niewiele lub big endian zostanie wybrana dla każdego zadania dynamicznie.

Poniżej logika mówi ci kolejność bajtów

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"); 

Takie zachowanie będzie taka sama dla obu c i c++

8

Czy otrzymam adres LSB i lub MSB?

Jest to platforma zależne: to będzie najniższy adresowany bajt, które mogą być MSB lub LSB w zależności od używanej platformy za endianness.

Chociaż nie jest to napisane w normie bezpośrednio, to jest to, co implikowane przez sekcji 6.3.2.3.7:

Kiedy wskaźnik do obiektu jest konwertowany do wskaźnika do typu postaci, wynik wskazuje najniższy zaadresowany bajt obiektu.


będzie działać w różny sposób między platformami?

Tak


Czy istnieje różnica pomiędzy tutaj C i C++?

nr: to jest zależne od platformy zarówno w C i C++

+0

Chociaż jestem prawie pewien, że to jest poprawne - czy możesz podać referencje dla tych roszczeń? – amit

+0

@amit Nie znalazłem bezpośredniego potwierdzenia, ale standard mówi "najniższy adresowany bajt" w sekcji, w której mówi o konwersji na wskaźnik "char". – dasblinkenlight

+0

Dziękuję za twój wysiłek. – amit

5

PTR przechowuje adres bajtu początkowego obiektu całkowitej. To, czy jest przechowywany największy lub najmniej znaczący bajt, zależy od platformy. Niektóre dziwne platformy używają nawet mieszanej endianness, w którym to przypadku nie będzie to MSB ani LSB.

Nie ma różnicy między C i C++ pod tym względem.

8

To zależy od endiancji platformy; jeśli jest to platforma małego endianina, dostaniesz wskaźnik do LSB, jeśli jest to platforma typu big-endian, wskaże MSB. Istnieją nawet kombinacje endianowe, w tym przypadku może Bóg zmiłuj się nad swoją duszą. sprawdź konkretną dokumentację swojego kompilatora/procesora.

Mimo to, można przeprowadzić szybką kontrolę w czasie wykonywania:

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"); 

Nawiasem mówiąc, aby wydrukować wskazówki należy użyć %p zastępczy, nie %d.

+0

Proszę wyjaśnić moje małe wątpliwości. Zgodnie z moją wiedzą, mieszany system endianowy wybierze małego lub dużego endiana dla każdego zadania. Proszę, powiedz mi, w jaki sposób korzystasz z innego przypadku w swoim porgramie. Czy moje rozumienie mieszanego endianina jest błędne? – rashok

+0

"Mixed endian" to pojęcie używane w architekturze, w której uporządkowanie bajtów nie jest kanonicznym big-endianem lub little-endianem (w niektórych przykładach sprawdź wikipedię); mój kod po prostu sprawdza, czy reprezentacja pamięci 32-bitowej liczby całkowitej pasuje do oczekiwanej dla systemów big-endian lub little-endian, jeśli nie pasuje, nie bada dalej i po prostu mówi, że jest to mieszany endian. –

3

Co to jest MSB dla mojego VC++ 2010 i Digital Mars. Ale jest to związane z endianizmem.

Odpowiedzi na te pytania podają niektóre informacje: Detecting endianness programmatically in a C++ program.

Tutaj użytkownik "none" mówi:

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

To daje pewne bajt informacji

1

dobrze mogę uzyskać LSB adresu I lub MSB?

To zależy od urządzenia i systemu operacyjnego. Na dużych maszynach endian i OS otrzymasz MSB, a na małych maszynach endian i OS otrzymasz LSB.

Windows to zawsze mały endian. Wszystkie (najbardziej?) Smaki Linuksa/Uniksa na x86 to mały endian. Linux/Unix na maszynach Motorola jest dużym endianem. Mac OS na maszynach x86 jest mało zaawansowany. Na komputerach PowerPC jest to duży endian.

czy działa inaczej w różnych platformach? Tak, będzie.

Czy jest różnica między c i C++? Prawdopodobnie nie.

Powiązane problemy