Я столкнулся с неожиданным результатом при циклическом переключении Int32.MaxValue
в System.Single
:
Int32 i = Int32.MaxValue;
Single s = i;
Int32 c = (Int32)s;
Debug.WriteLine(i); // 2147483647
Debug.WriteLine(c); // -2147483648
Я понял, что это должно быть переполнение, так как Single
не имеет достаточно битов взначение и значение Int32
, и оно округляется.Когда я изменил conv.r4
на conv.r4.ovf
в IL, OverflowExcpetion
выбрасывается.Достаточно справедливо ...
Однако, пока я изучал эту проблему, я скомпилировал этот код в java, запустил его и получил следующее:
int i = Integer.MAX_VALUE;
float s = (float)i;
int c = (int)s;
System.out.println(i); // 2147483647
System.out.println(c); // 2147483647
Я не знаю много оJVM, но мне интересно, как это происходит.Это кажется гораздо менее удивительным, но как сохранить лишнюю цифру после округления до 2.14748365E9?Сохраняет ли оно какое-то внутреннее представление, а затем заменяет его при приведении к int
?Или он просто округляется до Integer.MAX_VALUE
, чтобы избежать переполнения?