我在程序中使用了一个很大的数字-2147483648
,如果它是负数,我就乘以-1
例如:-2147483648 * -1
令人惊讶的是,我没有得到任何正数。所以我的整个代码都无法工作,因为这个值太大了。但是java编译器会发现并说这是一个很大的数字,你不能在这里使用它。Kotlin编译器将允许我在代码中使用这个大数字。
为什么会发生这种情况?我的理解错了吗?
数字2147483648大于最大的Integer
2147483647。由于Java确实将所有整数文本解释为int
,因此由于溢出,您不会从乘以-2147483648 * -1
得到正结果。
另一方面,Kotlin仅将2147483647及以上的值解释为Int
,并将其解释为Long
(请参见此处(。这就是为什么乘法在Kotlin中可以毫无问题地工作。
在Java中,您可以通过附加L
来指示至少一个数字是long
,或者将至少一个参数强制转换为long
(例如-2147483648L * -1
或-2147483648 * (long) -1
(来获得相同的结果。
为了补充Karsten的答案,它在这种特定情况下不起作用的原因是因为-2147483648
被Kotlin解释为Int
,因为它在int(特别是MIN_VALUE
(的允许范围内。但是你把它乘以-1
,这是另一个Int
,得到2147483648
的Int
结果
对于Ints
,这比MAX_VALUE
大一个,所以它溢出回到-2147483648
(MIN_VALUE
(,看起来什么都没发生,因为结果与您开始使用的数字相同。
基本上,你的起始值被解释为Int
,但这个特定乘法的结果需要是Long
,所以你要么也需要使起始值为Long
,要么乘以-1L