me encontré con un resultado inesperado en la ida y vuelta de Int32.MaxValue
en un System.Single
:¿Por qué el CLR desborda Int32.MaxValue -> Single -> Int32, donde la JVM no lo hace?
Int32 i = Int32.MaxValue;
Single s = i;
Int32 c = (Int32)s;
Debug.WriteLine(i); // 2147483647
Debug.WriteLine(c); // -2147483648
me di cuenta de que hay que desborda, ya Single
no tiene suficientes bits en la mantisa para mantener el valor Int32
, y se redondea. Cuando cambié el conv.r4
al conv.r4.ovf
en el IL, se lanza un OverflowExcpetion
. Justo lo suficiente ...
Sin embargo, mientras estaba investigando este problema, he recopilado este código en Java y corrió y dio la siguiente:
int i = Integer.MAX_VALUE;
float s = (float)i;
int c = (int)s;
System.out.println(i); // 2147483647
System.out.println(c); // 2147483647
No sé mucho acerca de la JVM, pero Me pregunto cómo lo hace. Parece mucho menos sorprendente, pero ¿cómo retiene el dígito extra después de redondear a 2.14748365E9? ¿Mantiene algún tipo de representación interna y luego lo reemplaza al volver al int
? ¿O simplemente redondea a Integer.MAX_VALUE
para evitar el desbordamiento?
Qué especificación es esto? – codekaizen
Ah, cómo esas ediciones hacen que los comentarios parezcan tan diferentes a cuando se publicaron por primera vez. – codekaizen