Qu'est-ce que c'est ? · bei.pm

Ce texte a été traduit automatiquement par OpenAI GPT-4o Mini.

Dans cette rubrique, il y a des articles sur les formats de fichiers et l'ingénierie inverse.

Cependant, il est ainsi fait :
Il existe de nombreux langages de programmation et de nombreuses personnes qui connaissent certaines choses sous des noms totalement différents - ou n'ont même aucune idée de l'existence des choses les plus fondamentales, car leur langage de programmation les en abstrait.

tl;dr :
Ma notation s'inspire grosso modo de C99 <stdint.h>. Ceux qui peuvent comprendre cette notation s'en sortiront sûrement avec la mienne.

Entier

Les entiers sont simplement des nombres entiers, c'est-à-dire des nombres sans partie décimale.

Les entiers sont généralement définis dans les formats de données dans une plage de valeurs fixe, en quelque sorte une résolution. Je l'indique en bits - parce qu'un "octet" et les types qui en découlent (Word, Qword, ...) sont généralement dépendants de la plateforme.

De plus, on fait également la distinction entre les nombres naturels (ℕ, c'est-à-dire sans signe - Non signé) et les entiers (ℤ, c'est-à-dire avec signe - Signé).
Cette information est indiquée par un signe dans l'identifiant (u ou s).

Il est possible que les entiers signés soient représentés soit par le complément à un soit par le complément à deux.
Tant que cela n'est pas précisé autrement, le complément à deux est utilisé, car c'est la représentation privilégiée dans l'informatique moderne.

Les nombres non signés sont indiqués dans mes documentations sous uint, suivis de l'indication de la précision en bits.
Les nombres signés sont indiqués dans mes documentations sous sint, également suivis de l'indication de la précision en bits.

Je m'abstiens d'utiliser le type de données "char" pour les caractères, car les chaînes de caractères ne représentent généralement que des chaînes de valeurs entières avec une interprétation spéciale.
Celles-ci sont donc représentées sous la forme uint(8)[].

Exemples :

Notation Équivalent C99 stdint.h Description Plage de valeurs
uint(16) uint16_t Entier non signé, longueur de 16 bits 0 - 65.535
sint(8) int8_t Entier signé, longueur de 8 bits, complément à deux -126 - 127
uint(24) uint32_t:24 Entier non signé, longueur de 24 bits 0 - 16.777.216

Valeurs à virgule fixe

Les valeurs à virgule fixe sont des valeurs numériques issues du spectre des nombres rationnels (Q), qui possèdent ainsi une virgule ainsi que des décimales.

Dans le cas des valeurs à virgule fixe, la position de la virgule est donc fixée par le type de données - d'où le nom.
Cela entraîne également une plage de valeurs fixe pour les nombres de ce type; exprimé mathématiquement, l'espace des nombres est fini.

En pratique, ce type de données est principalement utilisé sur des plateformes sans unité matérielle à virgule flottante suffisamment rapide, car le calcul des valeurs à virgule fixe peut se faire par des unités entières.

Ce type de données est également utilisé, par exemple, par des systèmes de gestion de bases de données lorsque des exigences fixes doivent être satisfaites.
On pense ici, par exemple, à des systèmes de stockage permanent de données financières ; la plupart des devises se limitent à 2 décimales. (Il n'est cependant pas judicieux d'utiliser des valeurs à virgule fixe à cet effet ; il est plus intelligent de stocker directement la plus petite unité monétaire sous forme d'entier et de laisser le reste à l'échelle de représentation)

Analogiquement aux spécifications entières, je donne pour les valeurs à virgule fixe la résolution du nombre avant et après la virgule :
ufixed(9,7) désigne un type de données qui réserve 9 bits non signés pour la valeur avant la virgule, ainsi que 7 bits pour la valeur après la virgule ; au total donc 16 bits de large et pouvant par exemple couvrir un intervalle de (0,0) à (511,127) comme un vecteur de deux entiers indépendants.
Cette interprétation laisserait cependant 28 valeurs inutilisées dans leur représentation décimale, car on se limiterait probablement plutôt à un maximum de (511,99) en pratique.

Au lieu d'une interprétation directe de la valeur à virgule fixe comme un vecteur de 2 entiers séparés - ce qui signifie presque toujours une zone de données inutilisée lors de la conversion en nombres décimaux et un report manuel - on peut également interpréter la zone après la virgule comme une fraction de leur résolution totale.
À l'exemple de ufixed(9,7), on obtient ainsi une fraction avec un dénominateur de 27 - la plage des nombres allant alors de 0,00 à 511 + 126127 Pour la conversion en une représentation décimale, la partie décimale doit donc être divisée par 128.
Avec cette variante, il est plus facile d'effectuer des opérations arithmétiques, car le report se produit automatiquement, ce qui fait que cette variante est généralement préférée.
Cependant, cette variante présente l'inconvénient que les décimales dans la représentation décimale n'ont plus de résolution garantie, une seule décimale ne représentant donc plus la valeur 0.01, mais 0.007874, ce qui entraînera des erreurs d'arrondi correspondantes.

La méthode d'interprétation utilisée est documentée en fonction du lieu d'utilisation.

Valeurs à virgule flottante

Les valeurs à virgule flottante sont des expressions mathématiques plus complexes, dans lesquelles un entier avec une précision fixe est exprimé par un terme mathématique de telle sorte que la partie décimale est effectivement formée par un décalage - s'alignant ainsi directement sur la notation scientifique.
La manière la plus courante de mettre cela en œuvre a été standardisée avec IEEE 754 et est depuis reconnue internationalement.

En général, une valeur à virgule flottante se compose des composants suivants :

Signe (0 ou 1) Exponent Manitisse

Tandis que le signe peut être facilement déduit comme une information binaire oui/non, le nombre réel se forme à travers l'équation
Manitisse * 2Exponent

De plus, il existe une série de valeurs constantes qui couvrent des cas particuliers de nombres rationnels - y compris ±∞ et NaN ("pas un nombre valide").

Les valeurs à virgule flottante sont particulièrement utiles lorsque la précision n'est pas si importante, car ce type de valeur entraîne inévitablement des erreurs d'arrondi et donc des pertes de précision. Typiquement, les valeurs à virgule flottante sont utilisées par exemple pour définir des coordonnées, comme des vecteurs de sommet dans des modèles 3D ou des courbes de Bézier/spline à des fins de représentation visuelle.

Dans les formats de données, les valeurs à virgule flottante sont spécifiées comme float(Manitisse, Exponent).
Si un format différent de IEEE 754 est utilisé, cela est indiqué en conséquence.