BitLab vzorek, který se někdo zeptá

Tohle je statická kopie kapitoly pro vyhledávače. Interaktivní verze má animované obrázky, kontrolní otázky a tlačítka, která příklad načtou do kalkulačky.

Endianita a velikosti: KB, KiB a chybějících 34 GB

Číslo 0x12345678 má čtyři bajty. V jakém pořadí leží v paměti? Existují dvě odpovědi a obě se používají:

pořadíkdo
big endian12 34 56 78 — nejvyšší bajt prvnísíťové protokoly, mnoho sběrnic, Motorola
little endian78 56 34 12 — nejnižší prvníx86, ARM v běžném režimu, RISC-V

Jméno je z Gulliverových cest, kde se válčí o to, ze kterého konce se má rozklepnout vejce. Je to přesná analogie: ani jedno není lepší, ale dohodnout se je nutné.

Big endian se čte líp, protože bajty jdou v tom pořadí, ve kterém se číslo píše. Little endian má tu vlastnost, že adresa nejnižšího bajtu je adresa celého čísla bez ohledu na šířku — což se hodilo, když se hodně přetypovávalo mezi 8, 16 a 32 bity.

Kdy na tom záleží

Uvnitř jednoho stroje nikdy. Procesor uloží a přečte to samé. Záleží na tom přesně ve chvíli, kdy bajty opustí stroj: soubor, síť, sběrnice, sdílená paměť mezi dvěma různými procesory. Proto se pořadí bajtů v síti předepsalo jako big endian a říká se mu network byte order — nikoli proto, že by byl lepší, ale aby to bylo jedno.

Kde na to narazíte v týhle akademii: senzor po SPI nebo I²C posílá šestnáctibitovou hodnotu ve dvou bajtech, a katalogový list říká, který jde první. Když se to prohodí, měření nevypadá jako nesmysl — vypadá jako jiné, ale možné číslo. To je horší než chyba, kterou je vidět. Podrobně v LinkLabu.

A ta druhá věc, o které se pořád lže

Disk s nápisem „500 GB“ se v systému hlásí jako 465 GB. Nikdo nic neukradl. Výrobce počítá v mocninách deseti (1 GB = 10⁹ bajtů), operační systém dlouho počítal v mocninách dvou (1024³) a říkal tomu taky „GB“.

1 kB = 1000 B     1 KiB = 1024 BIEC 80000-13

Správné jednotky pro mocniny dvou jsou KiB, MiB, GiB (kibi-, mebi-, gibi-), zavedené normou IEC v roce 1998. Rozdíl roste s každou předponou:

předponarozdíl
kB / KiB2,4 %
MB / MiB4,9 %
GB / GiB7,4 %
TB / TiB10,0 %

A jedna past navíc: síťová rychlost je v bitech, ne v bajtech. „100 Mb/s“ je při nejlepším 12,5 MB/s, a to ještě před režií rámců. Malé b a velké B se liší osmkrát.

Vzorce v této kapitole

KiB — dvojková předpona
1 KiB = 1024 B, 1 kB = 1000 B [B] IEC 80000-13