Co je co? · bei.pm
V této sekci jsou články o formátech souborů a reverzním inženýrství.
Ale je to takto:
Existuje mnoho programovacích jazyků a mnoho lidí, kteří některé věci znají pod úplně jinými názvy - nebo vůbec nemají tušení o existenci základních věcí, protože jejich programovací jazyk je od nich odděluje.
tl;dr:
Moje notace se zhruba řídí C99 <stdint.h>
. Kdo rozumí této notaci, určitě si poradí i s mojí notací.
Celé číslo
Celá čísla jsou jednoduše řečeno celá čísla, tedy čísla bez desetinné části.
Přitom jsou celá čísla ve formátech dat obvykle definována v rámci pevného rozsahu hodnot, jakýsi rozlišení. Tento rozsah uvádím v bitech - z toho důvodu, že "byte" a na něm založené typy (Word, Qword, ...) jsou obvykle závislé na platformě.
Dále se u celých čísel rozlišuje také mezi přirozenými čísly (ℕ, tedy bez znaménka - Unsigned) a celými čísly (ℤ, tedy se znaménkem - Signed).
Tato informace je viditelná podle znaménka v identifikátoru (u
nebo s
).
Přitom je možné, že celá čísla se znaménkem mohou být reprezentována buď jako jedničkový doplněk nebo jako dvojkový doplněk.
Pokud není uvedeno jinak, používá se dvojkový doplněk, protože je to preferovaná reprezentace v moderní informatice.
Celá čísla bez znaménka uvádím ve svých dokumentacích jako uint
, následované uvedením přesnosti v bitech.
Celá čísla se znaménkem uvádím ve svých dokumentacích jako sint
, také následované uvedením přesnosti v bitech.
Vyhýbám se používání datového typu "char" pro znaky, protože řetězce obvykle představují pouze řetězce celočíselných hodnot se speciální interpretací.
Ty jsou proto reprezentovány jako uint(8)[].
Příklady:
Notace | C99 stdint.h -ekvivalent |
Popis | Číselný rozsah |
---|---|---|---|
uint(16) | uint16_t | Nezáporné celé číslo, délka 16 bitů | 0 - 65.535 |
sint(8) | int8_t | Záporné celé číslo, délka 8 bitů, dvojkový doplněk | -126 - 127 |
uint(24) | uint32_t:24 | Nezáporné celé číslo, délka 24 bitů | 0 - 16.777.216 |
Hodnoty s pevným desetinným místem
Pevné desetinné hodnoty jsou číselné hodnoty z oblasti reálných čísel (Q), která tedy obsahují desetinnou čárku a desetinná místa.
U pevných desetinných hodnot je - jak už název napovídá - pozice desetinné čárky pevně určena datovým typem.
Tím se také vymezuje pevný rozsah čísel pro tento datový typ; matematicky vyjádřeno je číselný prostor konečný.
V praxi se tento datový typ používá především na platformách bez dostatečně rychlých hardwarových jednotek pro plovoucí desetinnou čárku, protože výpočty pevných desetinných hodnot mohou probíhat pomocí celočíselných jednotek.
Tento datový typ se také používá například v systémech správy databází, když musí být splněny pevné požadavky.
Můžeme si představit například systémy pro trvalé uchovávání finančních údajů; většina měn se omezuje na 2 místa za desetinnou čárkou.
(Není však rozumné používat pevné desetinné hodnoty pro tento účel; je chytřejší uložit přímo nejmenší měnovou jednotku jako celé číslo a zbytek ponechat úrovni zobrazení)
Podobně jako u celočíselných údajů uvádím u pevných desetinných hodnot rozlišení čísla před a za desetinnou čárkou:
ufixed(9,7)
označuje datový typ, který rezervuje 9 bitů bez znaménka pro hodnotu před desetinnou čárkou a 7 bitů pro hodnotu za desetinnou čárkou; celkově tedy má šířku 16 bitů a může tak například jako vektor dvou nezávislých celých čísel pokrýt rozsah od (0,0) do (511,127).
Tato interpretace by však ve své desetinné podobě nevyužila 28 čísel, protože by se pravděpodobně v praxi omezila maximálně na (511,99).
Místo přímé interpretace pevné desetinné hodnoty jako vektoru ze 2 oddělených celých čísel - což téměř vždy znamená nevyužitý datový prostor při převodu na desetinná čísla a manuální přenos - může být také desetinná část interpretována jako zlomek celkového rozlišení.
Při příkladu právě zmíněného ufixed(9,7)
se tedy získá zlomek s jmenovatelem 27 - číselný rozsah se pak pohybuje od 0,00 do 511 + 126⁄127
Pro převod na desetinnou podobu je tedy třeba dělit desetinné místo 128.
S touto variantou se dají jednoduše provádět aritmetické operace, protože přenos je automaticky zajištěn, což tuto variantu obvykle činí preferovanou.
Tato varianta má však nevýhodu, že desetinná místa v desetinné podobě již nemají garantované rozlišení, takže jednotlivé desetinné místo již neodpovídá hodnotě 0.01
, ale 0.007874
, což povede k odpovídajícím chybám zaokrouhlení.
Jaký způsob interpretace se použije, bude odpovídajícím způsobem zdokumentováno na místě použití.
Hodnoty s plovoucí desetinnou čárkou
Hodnoty s plovoucí desetinnou čárkou jsou matematicky složitější výrazy, kde se celé číslo s pevnou přesností vyjadřuje pomocí matematického výrazu tak, že se efektivně část za desetinnou čárkou vytváří posunem - a tím se přímo orientuje na vědeckou notaci.
Nejrozšířenější způsob, jak to realizovat, byl standardizován pomocí IEEE 754 a od té doby je mezinárodně uznáván.
Hodnota s plovoucí desetinnou čárkou obvykle sestává z následujících komponentů:
Znaménko (0 nebo 1 ) |
Exponent | Mantisa |
Zatímco znaménko může být jako binární ano/ne informace jednoduše odvozeno, samotné číslo se vytváří podle rovnice
Mantisa * 2Exponent
Kromě toho existuje řada konstantních hodnot, které pokrývají zvláštní případy racionálních čísel - mezi ně patří ±∞
a NaN
("neplatné číslo").
Hodnoty s plovoucí desetinnou čárkou jsou obzvlášť užitečné, když přesnost není tak důležitá, protože u tohoto typu hodnot dochází nevyhnutelně k zaokroulovacím chybám a tím k ztrátě přesnosti. Typicky se hodnoty s plovoucí desetinnou čárkou používají například k definici souřadnic, jako jsou vrcholové vektory ve 3D modelech nebo Bézierovy/Spline křivky pro optické reprezentace.
V datových formátech jsou hodnoty s plovoucí desetinnou čárkou specifikovány jako float(Mantisa, Exponent)
.
Pokud se použije formát odlišný od IEEE 754, bude to odpovídajícím způsobem uvedeno.