Što je što? · bei.pm
U ovoj rubrici nalaze se članci o formatima datoteka i reverznom inženjeringu.
No, stvar je takva:
Postoji mnogo programskih jezika i mnogo ljudi koji neke stvari poznaju pod potpuno drugim nazivima - ili nemaju nikakvu predstavu o postojanju najosnovnijih stvari, jer ih njihov programski jezik od toga udaljava.
tl;dr:
Moja notacija se otprilike oslanja na C99 <stdint.h>
. Tko se može snaći s ovom notacijom, sigurno će se snaći i s mojom notacijom.
Integer
Cjelobrojne vrijednosti su, jednostavno rečeno, cijeli brojevi, tj. brojevi bez decimalnog dijela.
Cjelobrojne vrijednosti su u podatkovnim formatima obično definirane unutar fiksnog opsega brojeva, gotovo kao rezolucija. Ovaj opseg izražavam u bitovima - iz razloga što su "bajt" i na njemu zasnovane vrste (Word, Qword, ...) obično ovisne o platformi.
Također, kod cjelobrojnih tipova razlikujemo između prirodnih brojeva (ℕ, tj. bez predznaka - Unsigned) i cjelobrojnih vrijednosti (ℤ, tj. s predznakom - Signed).
Ova informacija je očita iz predznaka u oznaci (u
ili s
).
Također, moguće je da cjelobrojne vrijednosti s predznakom budu prikazane kao jedinični komplement ili kao dvostruki komplement.
Osim ako nije drugačije navedeno, koristi se dvostruki komplement, jer predstavlja preferirani oblik prikaza u modernoj informatici.
Brojevi bez predznaka se u mojim dokumentacijama navode kao uint
, uz naknadno navođenje točnosti u bitovima.
Brojevi s predznakom se u mojim dokumentacijama navode kao sint
, također uz naknadno navođenje točnosti u bitovima.
Odlazim od korištenja tipa podataka "char" za znakove, jer nizovi znakova obično predstavljaju samo nizove cjelobrojnih vrijednosti s posebnim tumačenjem.
Zbog toga se predstavljaju kao uint(8)[].
Primjeri:
Notacija | C99 stdint.h -Ekvivalent |
Opis | Raspon brojeva |
---|---|---|---|
uint(16) | uint16_t | Unsigned Integer, 16 Bitova | 0 - 65.535 |
sint(8) | int8_t | Signed Integer, 8 Bitova, Dvojnički komplement | -126 - 127 |
uint(24) | uint32_t:24 | Unsigned Integer, 24 Bitova | 0 - 16.777.216 |
Festkomma-vrijednosti
Fiksne točke su numeričke vrijednosti iz spektra racionalnih brojeva (Q), koje stoga imaju točku i decimalna mjesta.
U fiksnim točkama, - odakle i naziv - položaj točke je unaprijed definiran tipom podataka.
To također rezultira fiksnim rasponom brojeva za ovaj tip podataka; matematički rečeno, prostor brojeva je konačan.
U stvarnosti, ovaj tip podataka se najčešće koristi na platformama bez dovoljno brzih jedinica za izračunavanje s pomičnom točkom, budući da se izračunavanje fiksnih točaka može provoditi putem cjelobrojnih jedinica.
Ovaj tip podataka se također koristi, na primjer, od strane sustava za upravljanje bazama podataka kada je potrebno zadovoljiti fiksne zahtjeve.
Možemo zamisliti sustave za trajno pohranjivanje financijskih podataka; većina valuta ograničava se na 2 decimalna mjesta.
(No, nije pametno koristiti fiksne točke za ovo; bolje je pohraniti najmanju valutu kao cjelobrojnu vrijednost i prepustiti ostatak sloju prikaza)
Analogno cjelobrojnim vrijednostima, kod fiksnih točaka navodim razlučivost broja prije i poslije točke:
ufixed(9,7)
označava tip podataka koji rezervira 9 bita za vrijednost prije točke, te 7 bita za vrijednost nakon točke; ukupno dakle 16 bita, što može pokriti područje od (0,0) do (511,127) kao vektor dvaju neovisnih cjelobrojnih brojeva.
Ova interpretacija bi međutim u decimalnom prikazu bespotrebno izgubila 28 brojeva, budući da bi se vjerojatno ograničili na maksimalno (511,99) u praksi.
umjesto izravne interpretacije fiksne točke kao vektora od 2 odvojena cjelobrojna broja - što gotovo uvijek znači neiskorišteni prostor podataka prilikom pretvorbe u decimalne brojeve i ručne prijenose - može se umjesto toga područje decimalnih mjesta interpretirati kao razlomak njihove ukupne razlučivosti.
Na primjeru upravo spomenutog ufixed(9,7)
dobivamo razlomak s nazivnikom od 27 - raspon brojeva tada ide od 0,00 do 511 + 126⁄127
Za pretvorbu u decimalni prikaz, decimalna mjesta treba podijeliti s 128.
Ovom varijantom lakše je provoditi matematičke operacije, jer se prijenos automatski generira, zbog čega se ova varijanta obično preferira.
Ipak, ova varijanta ima nedostatak da decimalna mjesta u decimalnom prikazu više nemaju zajamčenu razlučivost, tako da jedno decimalno mjesto više ne predstavlja vrijednost 0.01
, nego 0.007874
, što će dovesti do odgovarajućih grešaka u zaokruživanju.
Koja se metoda interpretacije koristi, bit će dokumentirana na mjestu korištenja.
Decimalni odnosno pokretni brojevi
Brojevi s pomičnom zarezom su matematički složeniji izrazi, pri čemu se cijeli broj s fiksnom preciznošću izražava kroz matematički izraz tako da se efektivno decimalni dio formira pomakom - i time se neposredno orijentira na znanstvenu notaciju.
Najčešći način implementacije ovoga standardiziran je putem
IEEE 754 i od tada je međunarodno priznat.
Broj s pomičnom zarezom obično se sastoji od sljedećih komponenti:
Predznak (0 ili 1 ) |
Eksponent | Mantisa |
Dok se predznak može jednostavno interpretirati kao binarna informacija Da/Ne, stvarni broj formira se preko jednadžbe
Mantisa * 2Eksponent
Dodatno, postoji niz konstantnih vrijednosti koje pokrivaju posebne slučajeve racionalnih brojeva - među kojima su ±∞
i NaN
("nije valjani broj").
Brojevi s pomičnom zarezom su posebno korisni kada točnost nije toliko važna, budući da pri ovoj vrsti vrijednosti neizbježno dolazi do pogrešaka pri zaokruživanju i tako do gubitka točnosti. Tipično, brojevi s pomičnom zarezom se koriste, na primjer, za definiranje koordinata, poput vrhova vektora u 3D modelima ili Bézier/Spline krivulja za optičke reprezentacijske svrhe.
U formatima podataka, brojevi s pomičnom zarezom specificiraju se kao float(Mantisa, Eksponent)
.
Ako se koristi format koji odstupa od IEEE 754, to će biti odgovarajuće naznačeno.