Шта је шта? · bei.pm
U ovoj rubrici postoje članci o formatima datoteka i reverznom inženjeringu.
Ali, stvar je sledeća:
Ima mnogo programskih jezika napolju i mnogo ljudi koji neke stvari poznaju pod potpuno drugačijim imenima - ili nemaju nikakvu predstavu o postojanju najosnovnijih stvari, jer ih njihov programski jezik od toga odvaja.
tl;dr:
Moja notacija se grubo oslanja na C99 <stdint.h>
. Ko može da razume ovu notaciju, sigurno će se snaći i sa mojom notacijom.
Целобројни
Celi brojevi su jednostavno rečeno cele brojeve, odnosno brojeve bez decimalnog dela.
Pritom su celi brojevi u podacima obično definisani unutar fiksnog opsega, praktično jedne rezolucije. Ovu rezoluciju izražavam u bitovima - zbog toga što su "bajt" i tipovi zasnovani na njemu (reči, kvadrati, ...) obično zavisni od platforme.
Takođe, između celih brojeva se pravi razlika između prirodnih brojeva (ℕ, tj. bez predznaka - Unsigned) i celih brojeva (ℤ, tj. sa predznakom - Signed).
Ova informacija se može videti iz predznaka u oznaci (u
ili s
).
Pritom je moguće da celi brojevi sa predznakom budu predstavljeni ili kao jedan komplement ili kao dva komplement.
Osim ako nije drugačije navedeno, koristi se dva komplement, jer predstavlja preferirani način prikaza u modernoj informatici.
Brojevi bez predznaka se u mojim dokumentacijama označavaju kao uint
, uz naknadno navođenje preciznosti u bitovima.
Brojevi sa predznakom se u mojim dokumentacijama označavaju kao sint
, takođe uz naknadno navođenje preciznosti u bitovima.
Odustajem od korišćenja tipa podataka "char" za karaktere, jer su nizovi karaktera obično samo niz celih brojeva sa specijalnom interpretacijom.
Zato se predstavljaju kao uint(8)[].
Primeri:
Notacija | C99 stdint.h -Ekvivalent |
Opis | Opseg vrednosti |
---|---|---|---|
uint(16) | uint16_t | Nepridruženi ceo broj, 16 Bitova dužine | 0 - 65.535 |
sint(8) | int8_t | Pridruženi ceo broj, 8 Bitova dužine, Dvojni komplement | -126 - 127 |
uint(24) | uint32_t:24 | Nepridruženi ceo broj, 24 Bitova dužine | 0 - 16.777.216 |
Фесткомма-вредности
Фиксне тачке су бројеви из спектра Рационалних бројева (Q), који стога имају тачку и декималне цифре.
Код фиксних тачака - отуда и назив - позиција тачке је чврсто дефинисана типом података.
Тиме се добија и фиксни опсег бројева за овај тип података; математички речено, бројни простор је обилан.
U стварности, овај тип података се углавном користи на платформама без довољно брзе хардверске јединице за плутајућу тачку, пошто израчунавање фиксних тачака може да се одвија преко целих бројева.
Овај тип података се, на пример, користи у системима за управљање базама података, када је неопходно испунити фиксне захтеве.
Тиме можемо размотрити системе за трајно чување финансијских података; већина валута ограничава се на 2 цифре после тачке.
(Међутим, није паметно користити фиксне тачке за ово; паметније је директно чувати најмању валутну јединицу као цело число и оставити остатак за представљање)
Слично као код целих бројева, код фиксних тачака наводим резолуцију броја пре и после тачке:
ufixed(9,7)
представља тип података који без знака резервише 9 бита за вредност пре тачке, као и 7 бита за вредност после тачке; укупно дакле 16 бита ширине, и тако, на пример, као вектор два независна цела броја може покрити опсег од (0,0) до (511,127).
Oва интерпретација би, међутим, у својој децималној представи изгубила 28 бројева, пошто би се вероватно ограничила на максимум (511,99) у пракси.
Уместо директне интерпретације фиксне тачке као вектора од 2 одвојена цела броја - што готово увек подразумева неiskorišћени податак током конверзије у децималне бројеве и ручни пренос - може се такође области после тачке интерпретирати као разломак у односу на целокупну резолуцију.
На примеру управо поменутог ufixed(9,7)
добијамо разломак са именитељем 27 - бројни опсег затим иде од 0,00 до 511 + 126⁄127
За конверзију у децималну представу, стога, позиција после тачке мора бити подељена са 128.
Ова варијанта омогућава лакше израчунавање операција, пошто се пренос аутоматски добија, што чини ову варијанту уобичајено пожељном.
Међутим, ова варијанта има недостак да позиције после тачке у децималној представи више немају гарантовану резолуцију, па једна децимална цифра неће представљати вредност 0.01
, већ 0.007874
, што ће довести до одговарајућих грешака у заокруживању.
Која интерпретација се користи, биће одговарајуће документовано на месту употребе.
Вредности са покретном запетом
Покретни записи су математички сложени изрази, где се целобrojна вредност са фиксном резолуцијом исказује преко математичког термина тако да се ефикасно део после запете формира померањем - и тиме се непосредно оријентише на научну нотацију.
Најчешћи начин да се то реализује стандаризован је са
IEEE 754 и од тада је међународно признат.
При том, покретна вредност се обично састоји од следећих компоненти:
Знак (0 или 1 ) |
Експонента | Мантиса |
Док се знак као бинарна Ја/Не информација лако може одредити, сама цифра формира се преко једначине
Мантиса * 2Експонента
Поред тога, постоји и низ константних вредности које покривају посебне случајеве рационалних бројева - укључујући ±∞
и NaN
("неважећа бројка").
Покретне вредности су посебно корисне када тачност није толико важна, пошто код овог типа вредности неизбежно долази до грешака заокруживања и, тиме, губитка тачности. Типично, покретне вредности се користе, на пример, за дефиницију координата, као што су Вертекс-вектори у 3D моделима или Безје/Spline криве за оптичке репрезентационе сврхе.
У форматима података, покретне вредности се спецификују као float(Мантиса, Експонента)
.
Ако се користи формат који се разликује од IEEE 754, то ће бити одговарајуће назначено.