Cos'è cos'è? · bei.pm

Questo testo è stato tradotto automaticamente tramite OpenAI GPT-4o Mini.

In questa sezione ci sono articoli sui formati di file e sul reverse engineering.

Ma la situazione è questa:
Esistono molte lingue di programmazione là fuori e molte persone conoscono alcune cose con nomi completamente diversi - o non hanno affatto idea dell'esistenza di elementi fondamentali, perché il loro linguaggio di programmazione li ha astratti.

tl;dr:
La mia notazione si basa grossomodo su C99 <stdint.h>. Chi è familiare con questa notazione troverà sicuramente facile adattarsi alla mia.

Intero

Integer sono semplicemente numeri interi, ossia numeri senza una parte decimale.

In genere, gli Integer nei formati di dati sono definiti all'interno di uno spettro numerico fisso, praticamente una risoluzione. Questa viene espressa in bit - per il motivo che un "byte" e i tipi derivati (Word, Qword, ...) sono generalmente dipendenti dalla piattaforma.

Inoltre, si distingue tra i tipi di Integer anche tra numeri naturali (ℕ, cioè, senza segno - Unsigned) e numeri interi (ℤ, cioè, con segno - Signed).
Questa informazione è visibile tramite un segno nel identificatore (u o s).

È possibile che gli interi con segno siano rappresentati come complemento a uno o come complemento a due.
Finché non diversamente specificato, viene utilizzato il complemento a due, poiché rappresenta la forma preferita nella moderna informatica.

I numeri senza segno vengono indicati nei miei documenti come uint, con successiva indicazione della precisione in bit.
I numeri con segno vengono indicati nei miei documenti come sint, anch'essi con successiva indicazione della precisione in bit.

Evito di utilizzare il tipo di dato "char" per i caratteri, poiché le stringhe di caratteri di solito rappresentano solo sequenze di valori Integer con un'interpretazione speciale.
Queste vengono quindi rappresentate come uint(8)[].

Esempi:

Notazione Equivalente C99 stdint.h Descrizione Intervallo numerico
uint(16) uint16_t Intero senza segno, lunghezza 16 bit 0 - 65.535
sint(8) int8_t Intero con segno, lunghezza 8 bit, complemento a due -126 - 127
uint(24) uint32_t:24 Intero senza segno, lunghezza 24 bit 0 - 16.777.216

Valori con virgola fissa

I valori a punto fisso sono valori numerici appartenenti al dominio delle numeri razionali (Q), che quindi possiedono un punto e decimali.

Nel caso dei valori a punto fisso, la posizione del punto è fissa e determinata dal tipo di dato;
ciò comporta anche un intervallo numerico fisso per i numeri di questo tipo; matematicamente parlando, l'insieme dei numeri è finito.

Nella realtà, questo tipo di dato è utilizzato principalmente su piattaforme che non dispongono di un'unità hardware a virgola mobile sufficientemente veloce, poiché il calcolo dei valori a punto fisso può avvenire tramite unità intere.

Il tipo di dato viene anche utilizzato, ad esempio, dai sistemi di gestione dei database quando è necessario soddisfare requisiti fissi.
Pensiamo ad esempio a sistemi per la memorizzazione permanente di dati finanziari; la maggior parte delle valute si limita a 2 posizioni decimali. (Tuttavia, non è saggio usare valori a punto fisso per questo scopo; è più intelligente memorizzare direttamente l'unità monetaria più piccola come intero e lasciare il resto alla rappresentazione)

Analogamente alle specifiche intere, nei valori a punto fisso specifico la risoluzione del numero prima e dopo il punto:
ufixed(9,7) indica un tipo di dato che riserva 9 bit senza segno per il valore prima del punto e 7 bit per il valore dopo il punto; quindi ha una larghezza totale di 16 bit e può coprire, ad esempio, un intervallo di (0,0) a (511,127) come vettore di due interi indipendenti.
Tuttavia, questa interpretazione lascerebbe inutilizzati 28 numeri nella loro rappresentazione decimale, poiché in pratica ci si limiterebbe probabilmente a (511,99).

Invece di un'interpretazione diretta del valore a punto fisso come un vettore di 2 interi separati - il che comporterebbe sempre un'area di dati inutilizzata nella conversione in numeri decimali e un riporto manuale - il campo decimale può anche essere interpretato come frazione della sua risoluzione totale.
Nell'esempio del già citato ufixed(9,7), si ottiene quindi una frazione con un denominatore di 27 - l'intervallo numerico va quindi da 0,00 a 511 + 126127 Per convertire in una rappresentazione decimale, il decimale deve quindi essere diviso per 128.
Con questa variante, le operazioni matematiche possono essere eseguite più facilmente, poiché il riporto si verifica automaticamente, rendendo questa variante generalmente preferita.
Tuttavia, questa variante ha lo svantaggio che le posizioni decimali nella rappresentazione decimale non hanno più una risoluzione garantita, quindi una singola posizione decimale non rappresenta più il valore 0.01, ma 0.007874, il che porterà a errori di arrotondamento corrispondenti.

Il modo in cui si interpreta il valore sarà documentato di conseguenza nel punto di utilizzo.

Valori in virgola mobile

I valori in virgola mobile sono espressioni matematiche più complesse, in cui un numero intero con risoluzione fissa viene espresso tramite un termine matematico in modo che, effettivamente, la parte decimale venga formata tramite uno spostamento - orientandosi così immediatamente alla notazione scientifica.
Il modo più comune per implementare ciò è stato standardizzato con IEEE 754 ed è riconosciuto a livello internazionale da allora.

Un valore in virgola mobile consiste solitamente delle seguenti componenti:

Segno (0 o 1) Esponente Mantissa

Mentre il segno può essere facilmente dedotto come informazione binaria di sì/no, il numero effettivo si forma tramite l'equazione
Mantissa * 2Esponente

In aggiunta, ci sono una serie di valori costanti che coprono casi particolari di numeri razionali - tra cui ±∞ e NaN ("non è un numero valido").

I valori in virgola mobile sono particolarmente utili quando la precisione non è così importante, poiché con questo tipo di valori si verificano necessariamente errori di arrotondamento e quindi perdite di precisione. Tipicamente, i valori in virgola mobile vengono utilizzati, ad esempio, per definire coordinate, come i vettori vertice nei modelli 3D o curve Bézier/Spline per scopi di rappresentazione ottica.

Nel formato dei dati, i valori in virgola mobile sono specificati come float(Mantissa, Esponente).
Se viene utilizzato un formato diverso da IEEE 754, questo viene specificato di conseguenza.