Што такое? · bei.pm

Гэты тэкст быў аўтаматычна перакладзены з дапамогай OpenAI GPT-4o Mini.

У гэтай рубрыцы ёсць артыкулы пра фарматы файлаў і реверс-інжынерынг.

Але справа ў тым:
Сярод нас шмат моў праграмавання і шмат людзей, якія ведаюць некаторыя рэчы пад зусім іншымі назвамі - або наогул не маюць уяўлення пра існаванне самых асноўных рэчаў, бо іх мова праграмавання адцягвае іх ад гэтага.

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 + 126127 Для пераўтварэння ў дзесятковую форму дробавую частку неабходна дзяліць на 128.
З гэтай версіяй прасцей праводзіць вылічальныя аперацыі, бо перанос адбуваецца аўтаматычна, што робіць гэтую версію ў большасці выпадкаў перавагай.
Але ў гэтай версіі ёсць недахоп, што дробавыя часткі ў дзесятковай форме больш не маюць гарантаванага дазволу, адзіная дзесятка больш не адпавядае значэнню 0.01, а 0.007874, што прывядзе да адпаведных памылак акруглення.

Якая інтэрпрэтацыя будзе выкарыстоўвацца, дакументуецца ў адпаведным месцы прымянення.

Значэнні з плаваючай кропкай

Плаваючыя лікі — гэта матэматычна складанейшыя выразы, дзе цэлае лік з фіксаванай дакладнасцю выяўляецца праз матэматычны тэрмін так, што фактычна частка пасля коскі фармуецца шляхам зрушэння — і тым самым непасрэдна арыентуецца на навуковую натацыю.
Найбольш распаўсюджаны спосаб рэалізаваць гэта быў стандартызаваны з дапамогай IEEE 754 і з таго часу міжнародна прызнаны.

Плаваючы лік у звычайным выпадку складаецца з наступных кампанентаў:

Знак (0 або 1) Экспанент Мантыса

Хоць знак як бінарная інфармацыя «так/не» можа быць лёгка вызначаны, сама лікавая велічыня фармуецца па формуле
Мантыса * 2Экспанент

Дадаткова існуе шэраг канстантных значэнняў, якія ахопліваюць асаблівыя выпадкі рацыянальных лікаў — у тым ліку ±∞ і NaN ("няма сапраўднага ліку").

Плаваючыя лікі асабліва карысныя, калі докладнасць не такая важная, бо ў гэтым тыпе значэнняў немінуча ўзнікаюць памылкі акруглення і, такім чынам, страты дакладнасці. Тыпова плаваючыя лікі выкарыстоўваюцца, напрыклад, для вызначэння каардынат, як вектары вяршынь у 3D мадэлях або кривыя Bézier/Spline для оптычных прадстаўленняў.

У фарматах дадзеных плаваючыя лікі задаюцца як float(Мантыса, Экспанент).
Калі выкарыстоўваецца фармат, які адрозніваецца ад IEEE 754, гэта адпаведным чынам указваецца.