Čo je čo? · bei.pm

Tento text bol automaticky preložený pomocou OpenAI GPT-4o Mini.

V tejto rubrike sú články o formátoch súborov a reverznom inžinierstve.

Ale je to takto:
Existuje množstvo programovacích jazykov a mnoho ľudí pozná niektoré veci pod úplne inými názvami - alebo dokonca nemajú tušenie o existencii najzákladnejších vecí, pretože ich programovací jazyk to od nich abstrahuje.

tl;dr:
Moja notácia sa približne zakladá na C99 <stdint.h>. Kto rozumie tejto notácii, určite sa zorientuje aj v mojej notácii.

Celé číslo

Celé čísla sú jednoducho povedané celé čísla, teda čísla bez desatinnej časti.

Celá čísla sú zvyčajne v dátových formátoch definované v rámci pevného rozsahu čísel, akýsi rozlíšením. Tento rozsah udávam v bitoch - z dôvodu, že "byte" a na ňom založené typy (Word, Qword, ...) sú zvyčajne závislé od platformy.

Okrem toho sa medzi typmi celých čísel rozlišuje aj medzi prirodzenými číslami (ℕ, teda bez znamienka - Unsigned) a celými číslami (ℤ, teda so znamienkom - Signed).
Táto informácia je zrejmá z predpony v identifikátore (u alebo s).

Je možné, že číselné hodnoty so znamienkom sú buď reprezentované ako jedničkový doplnok alebo ako dvojný doplnok.
Pokým nie je uvedené inak, používa sa dvojný doplnok, pretože v modernej informatike predstavuje preferovanú reprezentáciu.

Čísla bez znamienka uvádzam vo svojich dokumentáciách ako uint, s následným uvedením presnosti v bitoch.
Čísla so znamienkom uvádzam vo svojich dokumentáciách ako sint, rovnako s následným uvedením presnosti v bitoch.

Vyhýbam sa používaniu dátového typu "char" pre znaky, pretože reťazce zvyčajne predstavujú iba reťazce celých hodnôt s osobitou interpretáciou.
Tieto sú preto reprezentované ako uint(8)[].

Príklady:

Notácia C99 stdint.h-ekvivalent Popis Číselný rozsah
uint(16) uint16_t Nezáporné celé číslo, dĺžka 16 bitov 0 - 65.535
sint(8) int8_t Záporné celé číslo, dĺžka 8 bitov, dvojkový doplnok -126 - 127
uint(24) uint32_t:24 Nezáporné celé číslo, dĺžka 24 bitov 0 - 16.777.216

Hodnoty s pevnou desatinnou čiarkou

Pevné desatinné hodnoty sú číselné hodnoty zo spektra racionálnych čísel (Q), ktoré teda obsahujú desatinnú čiarku a desatinné miesta.

Pri pevných desatinných hodnotách je - a preto aj názov - pozícia desatinnej čiarky pevne určená typom dát.
Týmto sa vytvára aj pevný rozsah čísel pre hodnoty tohto typu dát; matematicky vyjadrené, číselný priestor je konečný.

V skutočnosti sa tento typ dát prevažne používa na platformách bez dostatočne rýchlej hardvérovej jednotky pre pohyblivé desatinné body, pretože výpočty pevných desatinných hodnôt môžu prebiehať cez celočíselné jednotky.

Tento typ dát sa tiež používa napríklad databázovými systémami na správu dát, keď je potrebné splniť pevné požiadavky.
Možno si predstaviť systémy na trvalé uchovávanie finančných dát; väčšina mien sa obmedzuje na 2 desatinné miesta. (Nie je múdre používať pevné desatinné hodnoty pre tento účel; rozumnejšie je priamo uložiť najmenšiu menovú jednotku ako celé číslo a nechať zvyšok na úrovni zobrazenia)

Analogicky k celočíselným údajom uvádzam pri pevných desatinných hodnotách rozlíšenie čísla pred a po desatinnej čiarke:
ufixed(9,7) označuje typ dát, ktorý bez znamienka rezervuje 9 bitov pre hodnotu pred desiatkovou čiarkou a 7 bitov pre hodnotu po desiatkovej čiarke; teda má celkovú šírku 16 bitov a môže tak pokryť rozsah (0,0) až (511,127) ako vektor dvoch nezávislých celých čísel.
Táto interpretácia by však v desiatkovom zobrazení nevyužila 28 číslic, pretože v praxi by sa pravdepodobne obmedzila maximálne na (511,99).

Namiesto priamej interpretácie pevnej desatinnej hodnoty ako vektora z 2 samostatných celých čísel - čo takmer vždy znamená nevyužitý dátový priestor pri konverzii na desatinné čísla a ručný prenos - sa môže namiesto toho oblasť po desatinnej čiarke interpretovať ako zlomok celého rozlíšenia.
Na príklade predtým spomenutého ufixed(9,7) vzniká zlomek so zlomkom s menovateľom 27 - rozsah čísel sa potom pohybuje od 0,00 po 511 + 126127 Aby sme prevedli na desiatkové zobrazenie, musíme teda podeliť desatinné miesto 128.
S touto variantou je jednoduchšie vykonávať aritmetické operácie, pretože prenos sa automaticky vykonáva, čo robí túto variantu vo všeobecnosti preferovanou.
Táto varianta však má nevýhodu, že desatinné miesta v desiatkovom zobrazení už nemajú zaručené rozlíšenie, takže jedno desatinné miesto už nemá hodnotu 0.01, ale 0.007874, čo povedie k zodpovedajúcim chybám zaokrúhlenia.

Ktorá interpretačná metóda sa použije, sa dokumentuje na príslušnom mieste použitia.

Hodnoty s pohyblivou rádovou či desatinnou čiarkou

Hodnoty s plávajúcou rádovou čiarkou sú matematicky zložitejšie výrazy, pri ktorých sa celé číslo s pevnou presnosťou vyjadruje prostredníctvom matematického výrazu tak, že sa efektívne vytvára časť za desatinnou čiarkou posunutím - a tým sa priamo orientuje na vedeckú notáciu.
Najbežnejší spôsob implementácie bol štandardizovaný s IEEE 754 a odvtedy je medzinárodne uznávaný.

Hodnota s plávajúcou rádovou čiarkou sa zvyčajne skladá z nasledujúcich komponentov:

Znamienko (0 alebo 1) Exponent Mantisa

Zatiaľ čo znamienko možno jednoduchým spôsobom získať ako binárnu informáciu áno/nie, skutočné číslo sa vytvára cez rovnicu
Mantisa * 2Exponent

Okrem toho existuje niekoľko konštantných hodnôt, ktoré pokrývajú špeciálne prípady racionálnych čísel - medzi nimi ±∞ a NaN ("neplatné číslo").

Hodnoty s plávajúcou rádovou čiarkou sú obzvlášť užitočné, keď presnosť nie je taká dôležitá, pretože pri tomto type hodnôt nevyhnutne dochádza k zaokrúhľovacím chybám a tým pádom aj k strate presnosti. Zvyčajne sa hodnoty s plávajúcou rádovou čiarkou používajú napríklad na definovanie súradníc, ako sú vrcholové vektory v 3D modeloch alebo Bézierove/Spline krivky pre optické reprezentácie.

V dátových formátoch sú hodnoty s plávajúcou rádovou čiarkou špecifikované ako float(Mantisa, Exponent).
Pokud sa používa formát odlišný od IEEE 754, bude to zodpovedajúcim spôsobom uvedené.