Rzutowanie tablicy unsigned char na typ short

0

Witam.

Mając taką tablicę:

unsigned char array[] = {1, 0};

Rzutując ją w taki sposób:

short a = *(short*)array;

W a jest wartość 1. Zastanawia mnie dlaczego. Tablica przechowywana jest jako ciągły fragment pamięci. W pamięci najpierw jest wartość 1 jako jeden bajt a potem 0 też jako jeden bajt. Typ short na moim komputerze ma 2 bajty a więc nie powinna być wartość 0x10 ?

2

Poczytaj o endianach... Urok little endianu :) Na innym procesorze miałbyś to, czego się spodziewasz... Dlatego właśnie niewskazane jest proste rzutowanie, jeśli nie wiemy jaką mamy architekturę

0

Wiem, że mam little endian, wiem na czym to polega. Domyślam się, że rzutując to w ten sposób w pamięci najpierw jest umieszczony bajt o wartości 0 a potem o wartości 1 dlatego jako wynik końcowy jest wartość 1 zapisana na 2 bajtach. Tylko nie rozumiem dlaczego skoro kolejność przechowywania bajtów ma znaczenie tylko dla danych o rozmiarze większym niż 1 bajt? Czy elementy tablicy nie są przechowywanie jeden po drugim w takiej kolejności jak zostały zapisanie w tablicy? Jak wyświetlę wartość adresu dla pierwszego elementu tablicy (tam gdzie przechowuję 1) i porównam go do wartości adresu drugiego elementu (tam gdzie 0), to ten pierwszy adres ma mniejszą wartość od 2 więc wygląda na to że te dane nie zostały zapisane w pamięci w little endian.

3

Typ short na moim komputerze ma 2 bajty a więc nie powinna być wartość 0x10 ?

Niby skąd zamiana nibbli? Albo 0x0001 albo 0x0100.

... więc wygląda na to że te dane nie zostały zapisane w pamięci w little endian.

System little/big endian ma wpływ na to jak są zapisywane i odczytywane zmienne kilku-bajtowe.

short tab[]= { 0x0102, 0x0304};
0x01, 0x02, 0x03, 0x04 <- big endian
0x02, 0x01, 0x04, 0x03 <- little endian
0x04, 0x03, 0x02, 0x01 <- oczekujesz tego?
Co by miało zwrócić tab[2]? Wartości sprzed tablicy?

1

Ja od siebie dodam, że taki cast to może być UB (a dereferencja po nim jest na pewno) i nie należy go wykonywać. Pomijając już nawet kłopoty z alignmentem.

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