Programowanie w systemie UNIX/Memory: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
HakanIST (dyskusja | edycje)
m fixing broken link
m endianess
Linia 50:
 
i może powodować zagrożenia informatyczne <ref>[[w:Bezpieczeństwo teleinformatyczne|Bezpieczeństwo teleinformatyczne]]</ref>
 
== Porządek bajtów i bitów (ang. byto order = endianess )==
 
Wiesz zapewne, że podstawową jednostką danych jest bit, który może mieć wartość 0 lub 1. Kilka kolejnych bitów<ref>Standard wymaga aby było ich co najmniej 8 i liczba bitów w bajcie w konkretnej implementacji jest określona przez makro CHAR_BIT zdefiniowane w pliku nagłówkowym limits.h</ref> stanowi bajt (dla skupienia uwagi, przyjmijmy, że bajt składa się z 8 bitów). Często typ short ma wielkość dwóch bajtów i wówczas pojawia się pytanie w jaki sposób są one zapisane w pamięci - czy najpierw ten bardziej znaczący - '''big-endian''', czy najpierw ten mniej znaczący - '''little-endian'''.
 
Skąd takie nazwy? Otóż pochodzą one z książki ''Podróże Guliwera'', w której liliputy kłóciły się o stronę, od której należy rozbijać jajko na twardo. Jedni uważali, że trzeba je rozbijać od grubszego końca (big-endian) a drudzy, że od cieńszego (little-endian). Nazwy te są o tyle trafne, że w wypadku procesorów wybór kolejności bajtów jest sprawą czysto polityczną, która jest technicznie neutralna.
 
Sprawa się jeszcze bardziej komplikuje w przypadku typów, które składają się np. z 4 bajtów. Wówczas są aż 24 (4 silnia) sposoby zapisania kolejnych fragmentów takiego typu. W praktyce zapewne spotkasz się jedynie z kolejnościami big-endian lub little-endian, co nie zmienia faktu, że inne możliwości także istnieją i przy pisaniu programów, które mają być przenośne należy to brać pod uwagę.
 
Poniższy przykład dobrze obrazuje oba sposoby przechowywania zawartości zmiennych w pamięci komputera (przyjmujemy CHAR_BIT == 8 oraz sizeof(long) == 4, bez bitów wypełnienia (ang. ''padding bits'')): <tt>unsigned long zmienna = 0x01020304;</tt> w pamięci komputera będzie przechowywana tak:
adres | 0 | 1 | 2 | 3 |
big-endian |0x01|0x02|0x03|0x04|
little-endian |0x04|0x03|0x02|0x01|
 
Zobacz :
* sprawdzanie za pomocą [[Bash#System|lscpu]]
* k[[C/Przenośność_programów#Konwersja_z_jednego_porz.C4.85dku_do_innego|onwersje w C]]
 
 
 
=Źródła=