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++?
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++?
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++
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++
Chociaż jestem prawie pewien, że to jest poprawne - czy możesz podać referencje dla tych roszczeń? – amit
@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
Dziękuję za twój wysiłek. – amit
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.
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
.
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
"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. –
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
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.
To niezdefiniowane zachowanie ** **. Jedynym sposobem na wydrukowanie 'ptr' jest'% p' lub konwersja do 'intptr_t' i użycie odpowiedniego makra do formatowania wydruku. –
Czy nie chodzi o endianizm? –