Ce este ce? · bei.pm

Acest text a fost tradus automat prin OpenAI GPT-4o Mini.

În această rubrica există articole despre formatele de fișiere și inginerie inversă.

Acum, trebuie să știm un lucru:
Există multe limbaje de programare și multe persoane care cunosc anumite lucruri sub nume complet diferite - sau nu au deloc idee despre existența celor mai fundamentale concepte, deoarece limbajul lor de programare le abstractizează.

tl;dr:
Notarea mea se bazează grosso modo pe C99 <stdint.h>. Cei care se descurcă cu această notare vor reuși cu siguranță să înțeleagă notarea mea.

Întreg

Integer sunt, pe scurt, numere întregi, adică numere fără parte zecimală.

Aceasta înseamnă că Integer-urile, în formatele de date, sunt de obicei definite într-un spectru fix de valori, practic o rezoluție. Aceasta o indic prin biți - din acest motiv, deoarece un "Byte" și tipurile derivate (Word, Qword, ...) sunt în general dependente de platformă.

În plus, se face distincție între numere naturale (ℕ, adică, fără semn - Unsigned) și numere întregi (ℤ, adică, cu semn - Signed).
Această informație este vizibilă printr-un semn în identificator (u sau s).

Este posibil ca numerele întregi cu semn să fie reprezentate fie ca complementul unu sau ca complementul doi.
Până când nu se specifică altfel, se folosește complementul doi, deoarece acesta este reprezentarea preferată în informatica modernă.

Numerele fără semn sunt indicate de mine în documentațiile mele ca uint, cu specificarea ulterioară a preciziei în biți.
Numerele cu semn sunt indicate de mine în documentațiile mele ca sint, de asemenea cu specificarea ulterioară a preciziei în biți.

Evitez utilizarea tipului de date "char" pentru caractere, deoarece șirurile de caractere reprezintă, de obicei, doar șiruri de valori Integer cu o interpretare specială.
Aceasta este, prin urmare, reprezentată ca uint(8)[].

Exemple:

Notare Equivalent C99 stdint.h Descriere Interval numeric
uint(16) uint16_t Număr întreg fără semn, lungime de 16 biți 0 - 65.535
sint(8) int8_t Număr întreg cu semn, lungime de 8 biți, complement față de 2 -126 - 127
uint(24) uint32_t:24 Număr întreg fără semn, lungime de 24 de biți 0 - 16.777.216

Valori cu virgulă fixă

Valorile cu punct fix sunt valori numerice din spectrul numerelor raționale (Q), având astfel un punct și cifre după punct.

În cazul valorilor cu punct fix, - de aici și numele - poziția punctului este fix definită de tipul de date.
Aceasta determină, de asemenea, un interval numeric fix pentru valorile acestui tip de date; exprimat matematic, spațiul numeric este finit.

În realitate, acest tip de date este folosit în principal pe platforme fără un hardware de calcul cu punct flotant suficient de rapid, deoarece calculul valorilor cu punct fix se poate face prin unități întregi.

De asemenea, acest tip de date este utilizat, de exemplu, de sistemele de gestionare a bazelor de date, atunci când trebuie îndeplinite cerințe fixe.
Se poate gândi, de exemplu, la sisteme pentru stocarea permanentă a datelor financiare; majoritatea monedelor se limitează la 2 cifre după punct. (Cu toate acestea, nu este înțelept să se folosească valori cu punct fix pentru acest lucru; este mai inteligent să se salveze direct cea mai mică unitate monetară ca întreg și să se lase restul nivelului de reprezentare)

Analog cu specificațiile întregi, la valorile cu punct fix specific rezoluția numărului înainte și după punct:
ufixed(9,7) desemnează un tip de date, care rezervă 9 biți fără semn pentru valoarea dinaintea punctului și 7 biți pentru valoarea din spatele punctului; în total, astfel, are o lățime de 16 biți și poate acoperi, de exemplu, ca un vector de două întregi independente un interval de (0,0) până la (511,127).
Cu toate acestea, această interpretare ar oferi, în reprezentarea sa zecimală, 28 de numere nefolosite, deoarece s-ar limita probabil mai degrabă la maximum (511,99) în practică.

În loc de o interpretare directă a valorii cu punct fix ca un vector format din 2 întregi separate - ceea ce practic înseamnă întotdeauna un interval de date neutilizat la conversia în numere zecimale și o transfer manual - se poate interpreta, de asemenea, intervalul zecimal ca un fracție a întregii sale rezoluții.
De exemplu, pentru ufixed(9,7), se obține astfel o fracție cu un numitor de 27 - intervalul numeric variază de la 0,00 la 511 + 126127 Pentru conversia într-o reprezentare zecimală, cifra după punct ar trebui împărțită la 128.
Cu această variantă, operațiile matematice sunt mai ușor de realizat, deoarece transferul se produce automat, ceea ce face ca această variantă să fie, în general, preferată.
Cu toate acestea, această variantă are dezavantajul că cifrele după punct în reprezentarea zecimală nu mai au o rezoluție garantată, astfel încât o singură cifră zecimală nu mai are echivalența 0.01, ci 0.007874, ceea ce va duce la erori de rotunjire corespunzătoare.

Care mod de interpretare este utilizat, este documentat corespunzător la locul de utilizare.

Valori cu virgulă mobilă

Valorile în virgulă mobilă sunt expresii matematice mai complexe, în care un număr întreg cu o rezoluție fixă este exprimat printr-un termen matematic, astfel încât efectiv partea zecimală este formată prin deplasare - orientându-se astfel direct după notația științifică.
Cea mai comună modalitate de a implementa aceasta a fost standardizată prin IEEE 754 și este recunoscută internațional din acel moment.

Un număr în virgulă mobilă constă de obicei din următoarele componente:

Semn (0 sau 1) Exponențial Mantisa

În timp ce semnul poate fi obținut ușor ca o informație binară de tip Da/Nu, numărul real se formează prin ecuația
Mantisa * 2Exponențial

În plus, există o serie de valori constante care acoperă cazuri speciale ale numerelor raționale - printre care ±∞ și NaN ("număr invalid").

Valorile în virgulă mobilă sunt utile în special atunci când precizia nu este atât de importantă, deoarece acest tip de valori este inevitabil supus erorilor de rotunjire și astfel pierderilor de precizie. De obicei, valorile în virgulă mobilă sunt utilizate, de exemplu, pentru a defini coordonate, cum ar fi vectorii de vârf în modele 3D sau curbele Bézier/Spline pentru scopuri de reprezentare optică.

În formatele de date, valorile în virgulă mobilă sunt specificate ca float(Mantisa, Exponențial).
Dacă se folosește un format diferit de IEEE 754, acest lucru este indicat corespunzător.