J'ai testé cette dans VB.NET (v3.5) et a obtenu la même chose.
La chose intéressante à propos des codes de hachage :
A) 0x40727800 = 1081243648
B) 0xBF8D880F = -1081243648
À L'Aide De Chiffres Après La Virgule.GetBits() j'ai trouvé
format : Mantisse (hhhhhhhh hhhhhhhh hhhhhhhh) Exposant(seee0000)
(h est des valeurs, 's' est un signe, un " e " exposant, 0 doit être zéros)
d1 ==> 00000000 00000000 00000B8B - 00010000
= (2955 / 10 ^ 1) = 295.5
faire ==> 5F7B2FE5 D8EACD6E 2E000000 - 001A0000
...qui convertit 29550000000000000000000000000 / 10^26 = 295.5000000...etc
** edit : ok, j'ai écrit un cryptage de 128 bits hexadécimal-décimal de la calculatrice et le ci-dessus est tout à fait correct
Cela ressemble fort à une conversion interne bug de la sorte. Microsoft déclare explicitement qu'ils ne garantissent pas leur implémentation par défaut de GetHashCode. Si vous l'utilisez pour quelque chose d'important alors il est probablement logique d'écrire votre propre GetHashCode pour le type décimal. La mise en forme d'un décimal fixe, fixe la largeur de la chaîne et de hachage semble fonctionner, par exemple (>29 décimales, > 58 largeur s'adapte à toutes les éventuelles décimales).
* edit : je ne sais pas à propos de ça. Elle doit être une erreur de conversion quelque part depuis la stockées précision change fondamentalement la valeur réelle de la mémoire. Que les codes de hachage fin comme signé négatifs des uns et des autres est un gros indice - aurait besoin de chercher plus loin par défaut dans le code de hachage de mise en œuvre pour en savoir plus.
28 ou 29 chiffres ne compte pas moins qu'il est dépendant de code qui ne permet pas d'évaluer les limites extérieures correctement. Le plus grand de 96 bits entier est accessible :
79228162514264337593543950335
vous pouvez donc avoir 29 chiffres, aussi longtemps que la chose en entier (sans virgule) est inférieur à cette valeur. Je ne peux pas aider mais penser que c'est quelque chose de beaucoup plus subtil dans le code de hachage de calcul quelque part.