Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Integer.MAX_值vs Kotlin Int.MAX_值_Java_Kotlin - Fatal编程技术网

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örre
0xffffff
-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