我试图追踪一些非常奇怪的 Java 行为。我有一个涉及双精度的公式,但“保证”给出一个整数答案——特别是一个无符号的 32 位整数(唉,Java 做得不好)。不幸的是,我的回答有时不正确。
最终我发现了这个问题,但这种行为对我来说仍然很奇怪:double
直接转换为 anint
似乎被限制MAX_INT
为有符号整数,而转换为double
a然后转换为 an给了我预期的答案( -1;无符号 32 位整数的 MAX INT,表示为有符号 32 位整数)。long
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”;但是直接转换给了我 MAX_INT 一个 32 位有符号整数。来自 C++ 背景,如果它给了我一个“奇数”而不是预期的 -1(又名“天真铸造”),我会理解,但这让我感到困惑。
那么,接下来的问题是:Java 中的这种“预期”行为(例如double
,直接转换为 an 的任何转换int
都将被“限制”为MAX_INT
)?强制转换是否对任何意外类型执行此操作?例如,我希望它与short
and相似byte
;但是当将超大双精度转换为浮动时,“预期行为”是什么?
谢谢!