very (./2444) :
Sauf que, contrairement au nombres signés, c'est un espace qui pu un peu beaucoup, où la soustraction est très problématique, donc par exemple on ne peut pas résoudre systématiquement dans l'espace une équation de premier degré ( 5x+142=0), etc. Bref même pas un corps.
Les nombres signés et non signés sont des représentants du
même anneau ℤ/2
8×2ⁿℤ. Cet anneau n'est pas un corps parce que 2
8×2ⁿ n'est pas premier. Mais on s'en fout.
Ce que tu veux dire, c'est que les nombres non signés ne seraient pas un groupe additif, ce qui est vrai si on considère le vrai ℕ, mais les ordinateurs ne travaillent pas avec ℕ ni ℤ, mais toujours avec un anneau fini ℤ/2
8×2ⁿℤ. Et là, la soustraction est très bien définie. (On est dans un anneau, qui est donc entre autre un groupe additif.)
Du coup la sureté des opérations instables (soustraction) dépend non pas du type, mais de la valeur des variables : (a-b) appartient à |N ssi a>=b, ce qu'il est impossible de savoir à la compilation. Du coup :
-soit on accepte la soustraction, et on a un type qui suxe totalement, instable
-soit on refuse la soustraction.
-soit on accepte la soustraction en castant vers les entiers relatifs (au moins dans certains cas), c'est mathématiquement bien pus logique mais ça casse presque tout l'intérêt d'utiliser des nombres non signés.
-soit on fait une soustraction complétement dégueu (où a-b = 0 si a<= b ), et bonjour les emmerdes.
On fait évidemment la chose la mieux définie: on soustrait dans ℤ/2
8×2ⁿℤ. (D'ailleurs, les standards C et C++ ne définissent ça
que pour les nombres non signés. Si ton addition ou soustraction
signée déborde, le résultat est totalement indéfini et le compilateur peut même générer du code qui formate ton disque dur!)
Exemple : ça doit se trouver mais on va commencer bateau. On dispose d'un espace de X Mo pour écrie un fichier, on veux savoir si il y assez de place... ( x - taille fichier ) > 0 ? Bha non tu peux pas le faire sans erreur. Bha ( x > taille fichier ) ? ça revient à faire la chose précédente mais on compte sur le compilo, processeur, etc, pour te sortir de la merde et hacker la difficulté.
Bah non.
x > taille fichier n'est pas la même chose que
( x - taille fichier ) > 0 dans ℤ/2
8×2ⁿℤ (avec la relation d'ordre induite par le représentant principal non signé de chaque classe d'équivalence). Et tout le monde écrit intuitivement la première version, qui est la bonne.
Si on veut rester cohérent et type-propre, il faudrait donc une fonction d'ordre spécifique, ça existe sur les entiers naturels, mais bon c'est relou à implémenter sans faire appel aux entiers relatifs.
La fonction d'ordre est toute simple, et c'est évidemment comme ça que c'est implémenté: on prend le représentant principal non signé de chaque classe d'équivalence (donc 0 pour 0+2
8×2ⁿℤ, 1 pour 1+2
8×2ⁿℤ, …, 2
8×2ⁿ-1 pour 2
8×2ⁿ-1+2
8×2ⁿℤ) et on range par conséquent: 0 < 1 < 2 < … < 2
8×2ⁿ-1, donc 0+2
8×2ⁿℤ < 1+2
8×2ⁿℤ < 2+2
8×2ⁿℤ < … < 2
8×2ⁿ-1+2
8×2ⁿℤ.
Je ne parle pas du jour où, muni de la soustraction dégueu, tu veux faire (a-b)+c et que tu te rends compte que (a-b)+c != c+a-b, que tu casses ton ordi et changes de métier.
Heureusement, personne n'implémente ta "soustraction dégueu" (qui s'appelle en réalité "soustraction saturante") comme soustraction par défaut, ce serait idiot. La vraie soustraction dans ℤ/2
8×2ⁿℤ satisfait (a-b)+c=c+a-b.