Kaj je kaj? · bei.pm
V tej rubriki so članki o formatih datotek in obratnem inženiringu.
Zdaj pa tako:
Obstaja veliko programskih jezikov in veliko ljudi, ki nekatere stvari poznajo pod povsem drugimi imeni - ali pa nimajo pojma o obstoju osnovnih stvari, ker jih njihov programski jezik od njih odmakne.
tl;dr:
Moja notacija se grobo opira na C99 <stdint.h>
. Kdor zna upravljati s to notacijo, bo zagotovo lahko razumel tudi mojo notacijo.
Celo število
Cela števila so preprosto rečeno cela števila, torej števila brez decimalnega dela.
Cela števila so v podatkovnih formatih običajno definirana znotraj fiksnega števila vrednosti, nekakšne ločljivosti. To izražam v bitih - zato, ker so "bajt" in iz njega izhajajoče vrste (Word, Qword, ...) običajno odvisne od platforme.
Poleg tega pri tipih celih števil razlikujemo še med naravnimi številkami (ℕ, torej brez predznaka - Unsigned) in celimi števili (ℤ, torej s predznakom - Signed).
Ta informacija je vidna preko predznaka v označevalniku (u
ali s
).
Možno je, da celi številki s predznakom bodisi predstavljamo kot enotno dopolnilo ali kot dvojno dopolnilo.
Dokler ni drugače navedeno, se uporablja dvojno dopolnilo, saj predstavlja preferirano obliko v sodobni informatiki.
Brezpredznakne številke so v mojih dokumentacijah navedene kot uint
, z nadaljnjim navedbo natančnosti v bitih.
Številke s predznakom so v mojih dokumentacijah navedene kot sint
, prav tako z nadaljnjim navedbo natančnosti v bitih.
Opustil sem uporabo podatkovnega tipa "char" za znake, saj niz znakov običajno predstavlja le zaporedje celih števil z posebno interpretacijo.
Ta se torej predstavlja kot uint(8)[].
Primeri:
Notacija | C99 stdint.h -ekvivalent |
Opis | Številski razpon |
---|---|---|---|
uint(16) | uint16_t | Neznan celoten, dolžina 16 bitov | 0 - 65.535 |
sint(8) | int8_t | Znamenjen celoten, dolžina 8 bitov, dvojiški komplement | -126 - 127 |
uint(24) | uint32_t:24 | Neznan celoten, dolžina 24 bitov | 0 - 16.777.216 |
Vrednosti s fiksno decimalno vejico
Fiksne decimalne vrednosti so številčne vrednosti iz spektra racionalnih števil (Q), ki torej vsebujejo decimalno vejico in decimalna mesta.
Pri fiksnih decimalnih vrednostih je - zato tudi ime - položaj vejice določen s tipom podatkov.
S tem se določi tudi fiksno številsko območje za števila tega tipa podatkov; matematično izraženo je številsko območje končno.
V resničnosti se ta tip podatkov večinoma uporablja na platformah brez dovolj hitre enote za plavajočo vejico, saj se lahko izračun fiksnih decimalnih vrednosti izvede s celotnimi enotami.
Ta tip podatkov se uporablja tudi, na primer, v sistemih za upravljanje baz podatkov, kadar je treba izpolniti fiksne zahteve.
Tu lahko pomislimo na sisteme za trajno shranjevanje finančnih podatkov; večina valut se omejuje na 2 decimalni mesti.
(Vendar ni pametno uporabljati fiksne decimalne vrednosti; boljše je, da se neposredno shrani najmanjša enota valute kot celo število in preostali del poveri nivoju predstavitve)
Analogno celotnim podatkom pri fiksnih decimalnih vrednostih navedem ločljivost števila pred in za vejico:
ufixed(9,7)
označuje tip podatkov, ki brez predznaka rezervira 9 bitov za vrednost pred vejico in 7 bitov za vrednost za vejico; skupaj torej 16 bitov širok in tako lahko na primer kot vektor dveh neodvisnih celih števil pokriva območje od (0,0) do (511,127).
Ta interpretacija bi v svoji decimalni predstavitvi neizkoriščeno izgubila 28 števil, saj bi se verjetno omejili na maksimalno (511,99) v praksi.
Namesto direktne interpretacije fiksne decimalne vrednosti kot vektorja iz dveh ločenih celih števil - kar skoraj vedno pomeni neizkoriščen podatkovni prostor pri pretvorbi v decimalna števila in ročno prenašanje - lahko namesto tega tudi območje decimalnih mest interpretiramo kot ulomek celotne ločljivosti.
Na primeru zgoraj omenjenega ufixed(9,7)
tako nastane ulomek z imenovalcem 27 - številsko območje gre od 0,00 do 511 + 126⁄127
Za pretvorbo v decimalno predstavitev bi bilo treba zato decimalno mesto deliti z 128.
S to varianto je lažje izvajati računske operacije, saj se prenos samodejno izvede, kar pomeni, da je ta varianta na splošno prednostna.
Vendar ima ta varianta slabost, da decimalna mesta v decimalni predstavitvi ne zagotavljajo več določene ločljivosti, torej posamezno decimalno mesto ne predstavlja več vrednosti 0.01
, ampak 0.007874
, kar bo privedlo do ustreznih zaokroževalnih napak.
Katera interpretacija se uporablja, je ustrezno dokumentirano na mestu uporabe.
Float ali drsni vrednosti
Plavajoče vrednosti so matematično bolj kompleksni izrazi, pri katerih se celo število z fiksno natančnostjo izrazi preko matematičnega izraza tako, da se dejansko decimalni del oblikuje s premikom - in se tako neposredno orientira na znanstveno notacijo.
Najpogostejši način za to je bil standardiziran z
IEEE 754 in je od takrat mednarodno priznan.
Plavajoča vrednost se običajno sestavlja iz naslednjih komponent:
Znaki (0 ali 1 ) |
Eksponent | Mantisa |
Medtem ko se znak lahko enostavno razbere kot binarna informacija Da/Ne, se dejanska številka oblikuje preko enačbe
Mantisa * 2Eksponent
Dodatno obstaja še vrsta konstantnih vrednosti, ki pokrivajo posebne primere racionalnih števil - med njimi ±∞
in NaN
("ni veljavna številka").
Plavajoče vrednosti so še posebej uporabne, kadar natančnost ni tako pomembna, saj pri tej vrsti vrednosti nujno pride do zaokroževalnih napak in s tem do izgube natančnosti. Tipično se plavajoče vrednosti uporabljajo za definiranje koordinat, kot so vertex vektorji v 3D modelih ali Bézier/Spline krivulje za optične prikazne namene.
V podatkovnih formatih so plavajoče vrednosti specifikane kot float(Mantisa, Eksponent)
.
Če se uporablja format, ki se razlikuje od IEEE 754, bo to ustrezno navedeno.