Што е што? · bei.pm
Во оваа рубрика има статии за форматите на датотеки и реверзно инженерство.
Но, еве како стои работата:
Постојат многу програмски јазици и многу луѓе кои некои работи ги познаваат под сосема различни имиња - или воопшто немаат представа за постоењето на основни работи, затоа што нивниот програмски јазик тоа го апстрахира од нив.
tl;dr:
Мојата нотација се основа грубо на C99 <stdint.h>
. Кој знае да работи со оваа нотација, сигурно ќе успее да се справи со мојата нотација.
Цел број
Цели броеви едноставно кажано се цели броеви, односно броеви без дел од десетичната точка.
При тоа, целите броеви во форматите на податоци обично се дефинирани во рамките на фиксна низа на броеви, речиси како резолуција. Ова го давам во битови - поради тоа што "бајт" и типовите кои произлегуваат од него (Word, Qword, ...) обично зависат од платформата.
Исто така, постои разлика помеѓу природни броеви (ℕ, односно, без знак - Unsigned) и цели броеви (ℤ, односно, со знак - Signed).
Оваа информација е видлива преку знак во идентификаторот (u
или s
).
При тоа, е можно знакот цели броеви да бидат претставени или како комплементи на единици или како комплементи на двојки.
Додека не е наведено поинаку, се користи комплементот на двојки, бидејќи во современата информатика тоа е преферираната претстава.
Броеви без знак ги давам во моите документи како uint
, со следнава информација за точноста во бити.
Броеви со знак ги давам во моите документи како sint
, исто така со следнава информација за точноста во бити.
Не користам тип на податоци "char" за знаци, бидејќи низите обично претставуваат само низи на цели броеви со специјална интерпретација.
Затоа тие се претставени како uint(8)[].
Примери:
Нотација | C99 stdint.h -еквивалент |
Опис | Опсег на бројки |
---|---|---|---|
uint(16) | uint16_t | Неопределен целоброен тип, должина 16 бита | 0 - 65.535 |
sint(8) | int8_t | Определен целоброен тип, должина 8 бита, двоичен комплемент | -126 - 127 |
uint(24) | uint32_t:24 | Неопределен целоброен тип, должина 24 бита | 0 - 16.777.216 |
Вредности на фиксна запетајка
Фиксни точки се бројни вредности од спектарот на Рационалните броеви (Q), кои во тој случај имаат запирка и десетични места.
Кај фиксните точки, положбата на запирката е предодредена од типот на податоците - оттука и името.
Оваа ситуација создава фиксна бројна област за броевите од овој тип; математички изразено, бројниот простор е конечен.
Во реалноста, овој тип на податоци се користи главно на платформи без доволно брза опрема за пресметување со флотирачка запирка, бидејќи пресметките на фиксните точки можат да се вршат преку цели броеви.
Овој тип на податоци, на пример, се користи од системите за управување со бази на податоци кога треба да се исполнат фиксни барања.
Треба да се размислува за системи за постојано чување на финансиски податоци; повеќето валути се ограничуваат на 2 места по запирката.
(Но, не е паметно да се користат фиксни точки за ова; подобро е директно да се чува најмала валутна единица како цел број и остатокот да се остави на ниво на претставување)
На сличен начин како кај целите бројеви, при фиксните точки ја дадам резолуцијата на бројот пред и по запирката:
ufixed(9,7)
означува тип на податоци кој без знак резервира 9 бита за вредноста пред запирката, како и 7 бита за вредноста по запирката; во целина, тоа е 16 бита широк и со тоа, на пример, може да покрие опсег од (0,0) до (511,127) како вектор на два независни цели броја.
Оваа интерпретација би оставила 28 броеви непотрошени во своето десетично претставување, бидејќи веројатно би се ограничиле на максимум (511,99) во пракса.
Наместо директна интерпретација на фиксниот број како вектор од 2 одделни цели броеви - што речиси секогаш значи непотрошен податочен простор при конверзија во десетични броеви и рачно пренесување - може да се интерпретира и подрачјето по запирката како дел од целокупната резолуција.
На примерот на споменатото ufixed(9,7)
, се добива дел со именител 27 - бројниот опсег оди од 0,00 до 511 + 126⁄127
За конверзија во десетично претставување, местото по запирката би требало да се дели со 128.
Со оваа варијанта, математичките операции се изведуваат полесно, бидејќи преносот автоматски се добива, што обично ја прави оваа варијанта предпочитана.
Меѓутоа, оваа варијанта има недостаток што местата по запирката во десетичното претставување веќе не располагаат со гарантирана резолуција, така што едно десетично место не ја има вредноста 0.01
, туку 0.007874
, што ќе доведе до соодветни грешки при заокружување.
Која интерпретација ќе се користи, ќе биде документирна на местото на употреба.
Вредности на дробни или лизгачки броеви
Пловечки вредности се математички по сложени изрази, при што целата бројка со фиксна резолуција се изразува преку математички термин така што ефективно делот после запетата се формира преку поместување - и на тој начин директно се ориентира кон научната нотација.
Најчестиот начин за реализација на ова беше стандарден со IEEE 754 и од тогаш е меѓународно признат.
При тоа, пловечкиот вредност обично се состои од следните компоненти:
Знак (0 или 1 ) |
Експонента | Мантиса |
Додека знакот може лесно да се добие како бинарна Да/Не информација, самата бројка се формира преку равенката
Мантиса * 2Експонента
Дополнително, постои низа константни вредности кои покриваат посебни случаи на рационални броеви - меѓу кои ±∞
и NaN
("невалидна бројка").
Пловечки вредности се особено корисни кога точноста не е толку важна, бидејќи со овој тип на вредности неизбежно доаѓа до грешки во заокружувањето и со тоа губење на точноста. Типично, пловечки вредности се користат, на пример, за дефинирање на координати, како што се вертекс-вектори во 3D модели или Безије/Spline кривини за оптички репрезентациски цели.
Во форматите на податоци, пловечки вредности се специфицирани како float(Мантиса, Експонента)
.
Ако се користи формат различен од IEEE 754, тоа ќе биде соодветно наведено.