我试图跟踪了一些非常奇怪的Java行为。 我有一个涉及到双重的公式,但“保证”给一个整数答案 - 具体而言,一个无符号的32位整数(其中,唉,Java没有做得很好)。 不幸的是,我的答案是不正确有时。
最后,我发现这个问题,但行为还是很奇怪,对我说:一个double
直接投给int
似乎在被加盖MAX_INT
对于有符号整数,而double
投的long
,然后将其转换为一个int
让我期望答案(-1;表示为带符号的32位整数无符号的32位整数的MAX INT)。
我写了一个小测试程序:
public static void main(String[] args) {
// This is the Max Int for a 32-bit unsigned integer
double maxUIntAsDouble = 4294967295.00;
long maxUintFromDoubleAsLong = (long)maxUIntAsDouble;
long maxUintFromDoubleAsInt = (int)maxUIntAsDouble;
int formulaTest = (int) (maxUintFromDoubleAsLong * 1.0);
int testFormulaeWithDoubleCast = (int)((long) (maxUintFromDoubleAsLong * 1.0));
// This is a more-or-less random "big number"
long longUnderTest = 4123456789L;
// Max int for a 32-bit unsigned integer
long longUnderTest2 = 4294967295L;
int intFromLong = (int) longUnderTest;
int intFromLong2 = (int) longUnderTest2;
System.out.println("Long is: " + longUnderTest);
System.out.println("Translated to Int is:" + intFromLong);
System.out.println("Long 2 is: " + longUnderTest2);
System.out.println("Translated to Int is:" + intFromLong2);
System.out.println("Max UInt as Double: " + maxUIntAsDouble);
System.out.println("Max UInt from Double to Long: " + maxUintFromDoubleAsLong);
System.out.println("Max UInt from Double to Int: " + maxUintFromDoubleAsInt);
System.out.println("Formula test: " + formulaTest);
System.out.println("Formula Test with Double Cast: " + testFormulaeWithDoubleCast);
}
当我运行这个小程序,我得到:
Long is: 4123456789
Translated to Int is:-171510507
Long 2 is: 4294967295
Translated to Int is:-1
Max UInt as Double: 4.294967295E9
Max UInt from Double to Long: 4294967295
Max UInt from Double to Int: 2147483647
// MAX INT for an unsigned int
Formula test: 2147483647
// Binary: all 1s, which is what I expected
Formula Test with Double Cast: -1
底部两行是我想了解的。 双投给我的预期“-1”; 但直投给了我一个32位有符号整数MAX_INT。 从C ++背景的,我想,如果它给了我一个“奇数”,而不是预期的-1(又称“幼稚铸造”)了解到,但这我茫然不知所措。
所以,接下来的问题:在Java的这种“预期”的行为(例如,任何double
直接施放到int
将被“封端”以MAX_INT
)? 请问铸件任何意外的类型做到这一点? 我希望它是类似short
和byte
,例如; 但什么是“正常现象”铸造一个超大的双浮动的时候?
谢谢!