Programmer en langage C
216
© Éditions Eyrolles
1 Compléments sur les types d’entiers
1.1 Rappels concernant la représentation
des nombres entiers en binaire
Pour fixer les idées, nous raisonnerons ici sur des nombres entiers représentés sur 16 bits, mais
il va de soi qu’il serait facile de généraliser notre propos à une taille quelconque.
Quelle que soit la machine (et donc, a fortiori, le langage !), les entiers sont codés en utilisant
un bit pour représenter le signe (0 pour positif et 1 pour négatif).
a) Lorsqu’il s’agit d’un nombre positif (ou nul), sa valeur absolue est écrite en base 2, à la suite
du bit de signe. Voici quelques exemples de codages de nombres (à gauche, le nombre en décimal,
au centre, le codage binaire correspondant, à droite, le même codage exprimé en hexadécimal) :
1
0000000000000001
0001
2
0000000000000010
0002
3
0000000000000011
0003
16
0000000000010000
0010
127
0000000001111111
007F
255
0000000011111111
00FF
b) Lorsqu’il s’agit d’un nombre négatif, sa valeur absolue est alors codée suivant ce que l’on
nomme la « technique du complément à deux ». Pour ce faire, cette valeur est d’abord exprimée
en base 2 puis tous les bits sont inversés (1 devient 0 et 0 devient 1) et, enfin, on ajoute une
unité au résultat. Voici quelques exemples (avec la même présentation que précédemment) :
-1
1111111111111111
FFFF
-2
1111111111111110
FFFE
-3
1111111111111101
FFFD
-4
1111111111111100
FFFC
-16
1111111111110000
FFF0
-256
1111111100000000
FF00
Le nombre 0 est codé d’une seule manière (0000000000000000).
Si l’on ajoute 1 au plus grand nombre positif (ici 0111111111111111, soit 7FFF en hexadécimal
ou 32768 en décimal) et que l’on ne tient pas compte de la dernière retenue (ou, ce qui revient
au même, si l’on ne considère que les 16 derniers bits du résultat), on obtient... le plus petit
nombre négatif possible (ici 1000000000000000, soit 8000 en hexadécimal ou -32768 en décimal). C’est ce qui explique le phénomène de modulo bien connu de l’arithmétique entière (les
dépassements de capacité n’étant jamais signalés, quel que soit le langage considéré).
Delannoy Livre.book Page 216 Mercredi, 6. mai 2009 4:26 16
216
© Éditions Eyrolles
1 Compléments sur les types d’entiers
1.1 Rappels concernant la représentation
des nombres entiers en binaire
Pour fixer les idées, nous raisonnerons ici sur des nombres entiers représentés sur 16 bits, mais
il va de soi qu’il serait facile de généraliser notre propos à une taille quelconque.
Quelle que soit la machine (et donc, a fortiori, le langage !), les entiers sont codés en utilisant
un bit pour représenter le signe (0 pour positif et 1 pour négatif).
a) Lorsqu’il s’agit d’un nombre positif (ou nul), sa valeur absolue est écrite en base 2, à la suite
du bit de signe. Voici quelques exemples de codages de nombres (à gauche, le nombre en décimal,
au centre, le codage binaire correspondant, à droite, le même codage exprimé en hexadécimal) :
1
0000000000000001
0001
2
0000000000000010
0002
3
0000000000000011
0003
16
0000000000010000
0010
127
0000000001111111
007F
255
0000000011111111
00FF
b) Lorsqu’il s’agit d’un nombre négatif, sa valeur absolue est alors codée suivant ce que l’on
nomme la « technique du complément à deux ». Pour ce faire, cette valeur est d’abord exprimée
en base 2 puis tous les bits sont inversés (1 devient 0 et 0 devient 1) et, enfin, on ajoute une
unité au résultat. Voici quelques exemples (avec la même présentation que précédemment) :
-1
1111111111111111
FFFF
-2
1111111111111110
FFFE
-3
1111111111111101
FFFD
-4
1111111111111100
FFFC
-16
1111111111110000
FFF0
-256
1111111100000000
FF00
Le nombre 0 est codé d’une seule manière (0000000000000000).
Si l’on ajoute 1 au plus grand nombre positif (ici 0111111111111111, soit 7FFF en hexadécimal
ou 32768 en décimal) et que l’on ne tient pas compte de la dernière retenue (ou, ce qui revient
au même, si l’on ne considère que les 16 derniers bits du résultat), on obtient... le plus petit
nombre négatif possible (ici 1000000000000000, soit 8000 en hexadécimal ou -32768 en décimal). C’est ce qui explique le phénomène de modulo bien connu de l’arithmétique entière (les
dépassements de capacité n’étant jamais signalés, quel que soit le langage considéré).
Delannoy Livre.book Page 216 Mercredi, 6. mai 2009 4:26 16
