Kotlin 要求对 Int 应用一个 64 位的掩码。问题在于,在 Kotlin 中,不可能将这样的数字以二进制或十六进制表示形式放入 Int 中,但使用直接位移或十进制值 (-2147483648) 可以。在 Java 中,这些值进入 Int 没有任何问题。为什么有人可以解释?
// Kotlin
var a: Int = 0b10000000_00000000_00000000_00000000 //не принимает Kotlin: The integer literal does not conform to the expected type Int
var b: UInt = 0b10000000_00000000_00000000_00000000 //The integer literal does not conform to the expected type UInt
var c: Int = 0x80000000 // не принимает Kotlin: The integer literal does not conform to the expected type Int
var d: Int = -2147483648 // заходит, ошибки нет, получаем нужное значение 0b10000000_00000000_00000000_00000000
var e: Int = 1 shl 31 //принимает и получаем нужное значение 0b10000000_00000000_00000000_00000000
在 Java 中做同样的事情:
// Java принимает без проблем
int a = 0b10000000_00000000_00000000_00000000; // работает
int b = 0x80000000; // тоже работает
文档(我认为 Int 可能存在一些差异 - 但没有)
Kotlin
Int 32 -2147483648 2147483647
Java
int 32 -2147483648 2147483647
Z.Y. 我想了解为什么它不起作用,正如你所看到的,我自己已经发明了拐杖。
=ina,b,右边的文字c被编译器解释为 Long 2147483648 (与 Int -2147483648 相同的表示,除了前导零),这是 out of boundsInt,并且在 Kotlin 中没有隐式类型转换。与 2147483648 in 一样d,您需要添加-如果
b您需要u在数字末尾添加后缀。java 和 kotlin 中的 int 是 32 位的。如何在这样的数字中设置 64 位 - 是的,没办法。你不能推动不推动的东西。使用 Long 类型 - 将有 64 位。
我查看了代码 - 有 32 位掩码(数字)。表示最有可能发生错误的 64 位。好的,让我们把问题读成 32,在那里你可以看到数字 64。
Java 是一种试图解决 /c++ 问题的语言(是的,通过它自己编写)并决定最好只使用有符号类型并丢弃无符号类型。
但是后来习惯上忽略不同溢出的错误(显然人们更好地理解位如何在低级别工作)。但在 Kotlin 中,他们决定修复这两个错误 - 引入无符号类型并处理溢出。
因此,在有符号类型中,最高有效位通常是符号位。1 表示减号。
我们来看例子
一切都在这里显而易见。左边写的数字比编译器 Int 的上限多一点,这样用户就不会受到伤害,根本不允许他在脚上开枪。
第三个例子
它是一样的。绝对地。只是数字不是用二进制写的,而是用十六进制写的。并且解释是一样的。
现在回到第二个例子。
这里看起来很正常,但是有一个问题——左边写的数字是一个有符号整数(默认类型),Kotlin 不希望这样,他显然需要它。而且很容易修复
最后加上一个小后缀,你就完成了。现在类型在双方都兼容,您可以分配它们。