Dvojková a šestnáctková: proč se píše 0xFF a ne 255
Soustava není vlastnost čísla. Číslo je to samé; mění se jen zápis. Dvě stě padesát pět je
255, 0xFF i 1111 1111 — tři způsoby, jak napsat jednu věc,
a hádka o to, který je „správný“, je hádka o to, který je zrovna čitelnější.
Šestnáctková není další soustava — je to zkratka pro dvojkovou
To je celý důvod, proč ji vidíte všude. Jedna šestnáctková číslice je přesně čtyři bity, protože 16 = 2⁴. Převod se tedy nepočítá, jen se čte po čtveřicích:
Zkuste totéž s desítkovou: 1101 0110₂ je 214, a mezi „214“ a těmi bity není žádný
vztah, který by se dal přečíst očima. Proto je adresa v paměti šestnáctkově, proto je maska
šestnáctkově a proto je barva #FF8C00 a ne rgb(255,140,0), když jde
o bajty.
Osmičková je z téže rodiny (tři bity na číslici) a přežívá hlavně
v unixových právech: chmod 755 je devět bitů rozdělených po třech — vlastník, skupina,
ostatní — a každá trojice je čtení, zápis, spuštění.
Prefixy, a jedna past
| zápis | soustava | odkud |
|---|---|---|
0x | 16 | C, a odtud skoro všude |
0b | 2 | C++14, Python, Rust, novější C |
0o | 8 | Python 3, JS — starší jazyky měly jen 0, což byl zdroj chyb |
Past, na kterou jsem narazil při psaní téhle labky
(chytil ji test kruhem, ne oko): šestnáctkový řetězec může začínat znaky, které vypadají
jako dvojkový prefix. 0b1f je docela obyčejné číslo 2847 — a parser, který
uvidí „0b“ a začne číst dvojkově, na tom havaruje. Prefix je prefix jen tehdy, když nemůže být
daty; když je soustava zadaná zvenčí, platí jen ten prefix, který k ní patří.