Што такое? · 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 біт, двайковы complément | -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 мадэлях або кривыя Bézier/Spline для оптычных прадстаўленняў.
У фарматах дадзеных плаваючыя лікі задаюцца як float(Мантыса, Экспанент)
.
Калі выкарыстоўваецца фармат, які адрозніваецца ад IEEE 754, гэта адпаведным чынам указваецца.