在kotlin中使用长数字时没有编译错误



我在程序中使用了一个很大的数字-2147483648,如果它是负数,我就乘以-1

例如:-2147483648 * -1

令人惊讶的是,我没有得到任何正数。所以我的整个代码都无法工作,因为这个值太大了。但是java编译器会发现并说这是一个很大的数字,你不能在这里使用它。Kotlin编译器将允许我在代码中使用这个大数字。

为什么会发生这种情况?我的理解错了吗?

数字2147483648大于最大的Integer2147483647。由于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,得到2147483648Int结果

对于Ints,这比MAX_VALUE大一个,所以它溢出回到-2147483648(MIN_VALUE(,看起来什么都没发生,因为结果与您开始使用的数字相同。

基本上,你的起始值被解释为Int,但这个特定乘法的结果需要是Long,所以你要么也需要使起始值为Long,要么乘以-1L

最新更新