2. Coder les entiers relatifs

Nous avons vu que le codage des entiers naturels par une série de bits se fait simplement en prenant l'écriture binaire... quid des entiers négatifs ? La plus élémentaire, jamais utilisée en pratique, consiste à utiliser l'un des bits (le premier) pour représenter le signe. Si l'on prend l'exemple d'un octet, on a alors un bit de signe et sept bits pour coder la valeur absolue (un nombre indépendamment de son signe). Dans ce cas, un même octet peut représenter un nombre entre 0 et 255 ou un nombre entre -127 et +127 (exemple ci-dessous). Ce codage présente deux défauts : l'addition est complexe (il faut traiter quatre cas) et le zéro a deux représentations (-0 et +0).

Exemples :

Pour ces raisons la méthode du bit de signe seul n'est (presque) plus utilisée. Une méthode un peu plus efficiente consiste, pour coder -n, à prendre le complément à un du codage de n, c'est à dire de remplacer chaque 0 par un 1 et inversement. Si l'on prend toujours l'exemple du codage sur un octet, on aura toujours un nombre entre -127 et +127 et toujours deux représentations du zéro, mais l'addition est maintenant plus facile à calculer. On peut démontrer, en effet, que si l'on ajoute un nombre a et le complément à un d'un nombre b, on trouve a-b-1 (aux problèmes de dépassement près). Pour cette raison, la méthode (quasi) universellement choisie aujourd'hui pour représenter les entiers relatifs (positifs et négatifs) est celle du complément à deux : on représente un nombre négatif en prenant son complément à un, puis en ajoutant un à l'écriture binaire obtenue. Dans le cas d'un codage sur un octet, on peut ainsi représenter les nombre entiers de -128 à +127.

Exemples :

Si l'on travaille sur un octet, la représentation binaire de -82 (en tant qu'entier positif ou négatif) est donc la même que celle de 256-82 (en tant qu'entier positif), c'est à dire 174. Cela veut dire que « 10101110 » peut coder aussi bien le nombre -82 que le nombre 174. Il peut aussi coder de nombreuses autres choses, par exemple les caractères « ® » (codage latin-1 des caractères) ou « Ž » (codage latin-2 des caractères).

Les nombres à virgule et les grands entiers demandent, eux, des codages plus complexes.