Bity po odczycie innym wskaźnikiem niż typ pierwotny

0

Cześć,

W sieci znalazłem takie zadanie:

char A[]={1,2,3,4,5,6,7,8,9};
cout << *((short*)A + 2)

Podane liczby całkowite zostaną zapisane w pamięci bez żadnych fajerwerków, tzn:

A[0] = 00000001
A[1] = 00000010
A[2] = 00000011 itd...

Natomiast kiedy wypisuję sobie reprezentacje binarną po rzutowaniu na short, to otrzymuję:

short* ptr = (short*)A;
ptr[0] = 00000010 00000001
ptr[1] = 00000100 00000011

I teraz moje pytanie: Myślałem, że rzutując na short, który ma 16 bitów będą się na niego składały bajty po kolej, idąc od A[0], A[1], A[2], A[3] i ten wskaźnik każde kolejne dwa bajty będzie łapał i łączył, czyli:

A[0]A[1] = 00000001 00000010
A[2]A[3] = 00000011 00000100

A bity są połączone odwrotnie:

A[1]A[0] = 00000010 00000001
A[3]A[2] = 00000100 00000011

Mógłby mi ktoś wytłumaczyć czemu tak się dzieje??

Pozdrawiam

3

Little endian -> google.

3
char A[]={1,2,3,4,5,6,7,8,9};
cout << *((short*)A + 2)

Druga linijka to undefined behavior. Nie możesz odczytać przez wskaźnik typu short tablicy char (strict aliasing, 3.10/10). Reszta kodu i "wyniki" nie mają przez to żadnego sensu.

7

Ten kod to UB, więc teoretycznie po takim castowaniu na short może się wyświetlić wszystko. Tutaj jednak zachowanie jest dość logiczne, tylko trzeba znać pojęcie endianness (pl). W skrócie: wszystkie popularne architektury używają little endian, a ludzie w naszym kręgu kulturowym big endian. Stąd Twoje zdziwienie.

0
pasasap napisał(a):

Little endian -> google.

A gdyby był Big Endian to wyniki by były takie jak przypuszczałem?

1 użytkowników online, w tym zalogowanych: 0, gości: 1