Java Integer.MAX_值vs Kotlin Int.MAX_值
我注意到一件有趣的事。Java Integer.MAX_值vs Kotlin Int.MAX_值,java,kotlin,Java,Kotlin,我注意到一件有趣的事。 Java的Integer.MAX\u值是0x7fffffff(2147483647) 科特林的Int.MAX_值为2147483647 但是如果你写 在Java中: int值=0xFFFFFF; //一切都很好(但打印值为“-1”) 在科特林: val值:Int=0xFFFFFFFF//您将得到异常 整数文本不符合预期的Int类型 有意思吧?因此,您可以在java中执行类似于newjava.awt.Color(0xFFFFFFFF,true)的操作,但在Kotlin中不能
Java的
Integer.MAX\u值是0x7fffffff
(2147483647)
科特林的Int.MAX_值为2147483647
但是如果你写
在Java中:
int值=0xFFFFFF;
//一切都很好(但打印值为“-1”)
在科特林:
val值:Int=0xFFFFFFFF//您将得到异常
整数文本不符合预期的Int类型
有意思吧?因此,您可以在java中执行类似于newjava.awt.Color(0xFFFFFFFF,true)
的操作,但在Kotlin中不能执行操作
Color
类在“二进制”级别上与该int一起工作,因此对于具有所有构造函数的两种平台(Color(intrgba)
或Color(intr,intg,intb,inta)
)。
我为kotlin找到的唯一解决方法是java.awt.Color(0xFFFFFFFF.toInt(),true)
你知道科特林为什么会这样吗?解释如下:
由于表示方式不同,较小的类型不是的子类型
大一点的。如果他们是,我们将有以下问题
排序:
因此,不仅身份,甚至平等都会悄然消失
到处都是
因此,较小的类型不会隐式转换为较大的类型
类型。这意味着我们不能将Byte类型的值分配给Int
没有显式转换的变量
部分答案是:
在Kotlin中,需要在-
符号前面加上前缀,以表示在Java中不正确的负整数
因此,Java似乎将十六进制文字解释为,而Kotlin将它们视为无符号
否定必须手动完成
小旁白:JetBrains的Kotlin转换器实际上可以转换
int a = 0xffffffff;
到
但这可能只是因为它确实意识到了你所注意到的
但是,根本没有提到这一点。我认为,这个问题应该通过Kotlin 1.3和UInt
更多信息请参见此处:我认为Java会自动将数字,Int
扩大到Long
--请参见---也请参见---在Kotlin中,您必须明确地执行此操作,没有语言自动性来避免您选择过窄的类型。@Mörre0xffffff
是-1
作为int
的有效二元补码表示。两种语言之间的区别在于Kotlin文字似乎不接受two的补码表示法;文本0x8000000
是一个错误(在Java中,它是Integer.MIN_值
)。换句话说,必须使用一元-
运算符来表示负数。尽管我在这两种语言的规范中都找不到对此的任何具体提及。@Mörre,因为没有发生加宽转换,而您似乎认为有加宽转换。@Mörre在将int值应用于int字段时没有加宽。请参阅-当前主计划是(…)有大十六进制常量有无符号类型(即0xFFFFFF不是负整数,而是无符号整数,即UInt)。这是因为你想保护你免受意外溢出的细微差别,但99.9%的时候你使用十六进制,你可能关心的是位,而不是实际值。这不是问题。在Java中,0xffffff
仍然是int
。另外int
肯定不大于long
是的,我是苏re.0xFFFFFF
当解释为有符号时,显然是-1
(并且是32位)。该链接的注释是否有帮助?“您可以编写int i=(int)Long.MAX_VALUE;,它将是-1。我同意这很奇怪,因为编译器会抱怨int I=4294967295;但不会抱怨int I=0xFFFFFF;。我认为,基本上这是因为0x…被视为位序列,然后被强制转换为所需的类型。”但公平地说,这个答案并没有涵盖这个问题。我将把它留给获得反对票的人:)这句话实际上正是我的观点0xFFFFFFFF
是一个int
。与0b11111111111111111
相同,当作为32位整数处理时,高位为1
,并且由于符号整数的表示,其值为-1
。当被视为任何更宽的类型(即0xFFFFFFFFL
)时,该值当然是正值,但()
int a = 0xffffffff;
var a = -0x1