jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Comment FBCroco stocke-t-il ses données ? Lun 14 Oct 2019 - 9:24 | |
| Un petit tutoriel inspiré par un ancien article d'Amstrad magazine. Dites-moi si c'est assez clair. Des exemples supplémentaires seront fournis sous forme de programmes dans la prochaine version de FBCroco. - Code:
-
Sous le titre _A la découverte d'une fonction oubliée_, la revue _Amstrad Magazine_ avait publié un article décrivant les fonctions d'accès à la mémoire du BASIC Amstrad. Les exemples portaient sur le stockage des données en mémoire.
Le présent article reprend ce thème mais à l'adaptant à FBCroco, lequel utilise les modes de stockage de FreeBASIC.
Stockage des entiers --------------------
Chaque entier est stocké sur 4 octets (32 bits).
Si p représente l'adresse du premier octet, les 4 octets sont stockés dans l'ordre suivant :
p p + 1 p + 2 p + 3 +---------+---------+---------+---------+ | Octet_0 | Octet_1 | Octet_2 | Octet_3 | +---------+---------+---------+---------+ L'octet de poids fort est en dernier, selon la convention dite _little endian_. Pour avoir la représentation binaire ou hexadécimale du nombre il faut donc concaténer les octets dans l'ordre suivant :
| Octet_3 | Octet_2 | Octet_1 | Octet_0 |
Le premier bit est le bit de signe : 0 pour un nombre positif, 1 pour un nombre négatif.
La valeur du nombre est donc donnée par les 31 bits restants, ce qui permet de représenter des valeurs allant de 0 à 2^31 - 1 = 2147483647
Pour les nombres négatifs, mettre le premier bit à 1 revient à ajouter 2^32 = 2147483648. Il faut donc soustraire cette valeur.
La gamme de valeurs possibles pour les entiers est donc :
-2^32 ... 2^31 - 1 -2147483648 ... 2147483647 Stockage des réels ------------------
Les réels sont mis sous la forme d'un nombre dont la partie entière est égale à 1 (mantisse) multiplié par une puissance de 2.
Exemples :
12.345 = 1.543125 * 2^3 0.0678 = 1.0848 * 2^(-4) Les réels sont stockés en double précision sur 8 octets (64 bits) selon la norme IEEE 754 :
- le premier bit est le bit de signe - les 11 bits suivants codent un entier e égal à l'exposant de 2 augmenté de 1023 - les 52 bits restants codent un entier m correspondant à la partie _fractionnaire_ de la mantisse, multipliée par 2^52
Par exemple, pour le nombre 12.345 nous aurions :
e = 3 + 1023 = 1026 m = 0.543125 * 2^52 = 2446017547615601
La partie entière de la mantisse étant égale à 1, la valeur absolue du nombre réel est :
(1 + m / 2^52) * 2^(e - 1023)
Le signe est attribué selon le premier bit.
L'exposant codé sur 11 bits va théoriquement de 0 à 2^11 - 1 = 2047. Toutefois les deux valeurs extrêmes sont réservées par la norme. Les valeurs acceptables pour e vont donc de 1 à 2046, soit -1022 à 1023 pour la puissance de 2.
Pour la mantisse, les valeurs possibles de m vont de 0 à 2^52 - 1 ; la mantisse va donc de 1 à :
1 + (2^52 - 1) / 2^52 = 2 - 2^(-52) Le plus petit nombre positif représentable est donc :
1 * 2^(-1022) ~ 2.225073858507201 * 10^(-308) et le plus grand nombre :
2^1023 * (2 - 2^(-52)) ~ 1.797693134862316 * 10^308 Le plus petit nombre x tel que (1 + x) a une représentation différente de x (appelé _epsilon machine_) est :
x = 2^(-52) ~ 2.220446049250313 * 10^(-16)
Stockage des chaînes de caractères ----------------------------------
Pour chaque chaîne de caractères FBCroco stocke deux informations :
1. Un _descripteur de chaîne_ constitué d'une suite de 3 entiers (12 octets) représentant :
- l'adresse p de la chaîne proprement dite - sa longueur L (également accessible par la fonction `len`) - une taille de bloc, égale à 36 pour FreeBASIC
2. La chaîne proprement dite, terminée par le caractère de code 0 (chaîne à zéro terminal, comme en C) Exemple avec la chaîne "Bonjour" :
Octet : p p+1 p+2 p+3 p+4 p+5 p+6 p+7 Code ASCII : 66 111 110 106 111 117 114 0 Caractère : B o n j o u r
La chaîne occupe donc (L + 1) octets, auxquels il faut ajouter les 12 octets du descripteur.
Références : 1. D. Martin, A la découverte d'une fonction oubliée, _Amstrad Magazine_ n° 2, p. 13-14. Disponible sur le Site des anciennes revues informatiques2. Wikipedia : Double-precision floating-point format | |
|