Entiers

Les entiers Common Lisp sont différents des entiers des autres langages car leur taille n'est pas limitée. Il n'y a pas de limitation concernant le nombre de bits dans la représentation d'un entier. La seule limitation est la taille de la mémoire. Exemple :

* (expt 1234 20)

67035243914691711794360082394262505332216263021359359696306176
*

Le type integer est un sous-type du type rational. Il y a deux sous-types du type integer : fixnum et bignum. Les fixnums sont les entiers dont la valeur absolue est suffisamment petite pour qu'on puisse la représenter dans un mot de l'ordinateur.

La norme exige qu'un fixnum soit représenté sur au moins 16 bits, mais le nombre exact dépend de l'implémentation. Il est possible de tester l'intervalle des fixnums en utilisant les deux constantes globales most-positive-fixnum et most-negative-fixnum. Exemple :

* most-positive-fixnum

536870911
* most-negative-fixnum

-536870912
*

Pour déterminer le nombre de bits correspondant, il suffit de calculer le logarithme (en base 2) de ces nombres. La version de CMUCL sur la famille de processeurs Pentium donne le résultat suivant :

* (log (- most-negative-fixnum) 2)

29.0
*

Le nombre de bits utilisés ici (29) peut paraître un peu étrange, mais s'explique facilement par la représentation interne des objets Common Lisp et en particulier des fixnums.

Les bignums sont les entiers qui nécessitent plus de bits que les fixnums. La conversion entre les deux est automatique. Si le résultat d'un calcul est un entier dont la valeur absolue est assez petite pour être représentée sous forme de fixnum, le résultat sera toujours un fixnum. Le système CMUCL contient deux prédicats supplémentaires par rapport à la norme : fixnump et bignump. Ces prédicats nous permettent de tester la représentation.

Common Lisp est aussi capable de manipuler des entiers représentés avec un nombre quelconque fixé de bits. Un tel entier est appelé un byte (qui ne doit donc pas être traduit par octet). Il est par exemple possible de créer un tableau dont le contenu est une suite d'entiers sur 21 bits. Certains de ces bytes ont souvent une repésentation efficace, en particulier ceux de 1, 8, 16 et 32 bits.

Irene DURAND
2011-10-14