flanker (./2447) :
Very > mais c'est simplement que l'addition n'est pas une opération interne
Kevin Kofler (./2449) :
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 ℤ/28×2ⁿℤ.
En assez bas niveau ouais. En assez bas niveau tout est une suite de bits, donc en fait tous les types du monde ne servent à rien et autant faire de l'assembleur directement etc.
Enfin je comprends bien la logique de l'anneau modulo 2^p, le truc cool c'est que en plus d'être mathématiquement élégant c'est ce que fait le processeur, je sais bien, mais bon c'est tellement cool que c'est une des premières causes de bugs informatiques ^^
Bon et en quoi la soustraction est différente ? Formellement c'est pareil, humainement c'est différent.
Souvent les gens vont travailler dans ℤ/2
8×2ⁿℤ en se disant "je m'en fou des dépassements car je travaille avec des très petits nombres, je suis trop large avec 32 ou 64 bits, etc."
Mais ça ne marche à peu près tant que l'on ne fait pas certains types d’opérations, comme l'exponentiation ou la soustraction. Sauf que les puissances, exponentiations, voir les multiplications, on se rend bien compte que ça peut donner des nombres importants. Alors que la soustraction est super fourbe : eh ouais tu fais 5-6 et tu débordes... Du coup je réitère que pour une utilisation naïve, c'est un peu compliqué de mettre la soustraction dans les entiers naturels. (et pourquoi utiliser ça si c'est pour se taper un if à chaque fois en plus ? )
Donc selon les cas, pour une utilisation naïve, ça va donner le résultat attendu grâce à un cast implicite, ou sinon ça va rester unsigned éventuellement surprendre l'utilisateur naif.
Bref vu d'une part le très faible gain et d'autre part le surnombre de problèmes potentiels important, je comprends largement que certains langages plutôt haut-niveau n'aient pas de type unsigned de base. À mon sens ça ressemble plus à une survivance de l'assembleur, où les mecs voulaient gratter un peu, que a un type qui a un vrai intérêt dans un langage plus haut niveau.
Évidemment on ne parle pas du mec conscient qui sait vraiment ce qu'il fait (qui représente un % de codeurs assez faible, mais passons ) et veut de la performance pour faire de l'arithmétique bien précise.
Kevin Kofler (./2449) :
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+28×2ⁿℤ, 1 pour 1+28×2ⁿℤ, …, 28×2ⁿ-1 pour 28×2ⁿ-1+28×2ⁿℤ) et on range par conséquent: 0 < 1 < 2 < … < 28×2ⁿ-1, donc 0+28×2ⁿℤ < 1+28×2ⁿℤ < 2+28×2ⁿℤ < … < 28×2ⁿ-1+28×2ⁿℤ.
tu as pas trouvé une explication encore plus fastidieuse pour dire que comparer deux éléments mudulo une puissance de 2 ça revient à comparer leur représentant, ie les p premiers bits ?