je suis tombé sur un résultat inattendu en rond Int32.MaxValue
déclenchement en System.Single
:Pourquoi le CLR déborde-t-il d'Int32.MaxValue -> Single -> Int32, ce qui n'est pas le cas de la JVM?
Int32 i = Int32.MaxValue;
Single s = i;
Int32 c = (Int32)s;
Debug.WriteLine(i); // 2147483647
Debug.WriteLine(c); // -2147483648
J'ai réalisé qu'il doit être débordait, puisque Single
n'a pas assez de bits dans la mantisse pour maintenir la valeur Int32
et ça arrondit. Lorsque j'ai changé le conv.r4
en conv.r4.ovf
dans le IL, un OverflowExcpetion
est levé. Juste assez ...
Cependant, alors que je faisais des recherches sur cette question, j'ai compilé ce code en Java et couru et a obtenu les éléments suivants:
int i = Integer.MAX_VALUE;
float s = (float)i;
int c = (int)s;
System.out.println(i); // 2147483647
System.out.println(c); // 2147483647
Je ne sais pas grand chose sur la machine virtuelle Java, mais Je me demande comment ça fait ça. Il semble beaucoup moins surprenant, mais comment conserve-t-il le chiffre supplémentaire après arrondi à 2.14748365E9? Est-ce qu'il conserve une sorte de représentation interne autour et ensuite le remplacer lors du renvoi à int
? Ou est-ce simplement arrondi à Integer.MAX_VALUE
pour éviter le débordement?
Quelle spé est-ce? – codekaizen
Ah, comment ces modifications rendent les commentaires apparaissent si différents que lors de la première publication. – codekaizen