Java Integer.MAX_VALUE vs Kotlin Int.MAX_VALUE
我注意到,一件有趣的事。
Java的Integer.MAX_VALUE是0x7fffffff(2147483647)
Kotlin的Int.MAX_VALUE是2147483647
但是如果你写
在Java中:
int value = 0xFFFFFFFF;
//everything is fine (but printed value is '-1')
在Kotlin:
val value: Int = 0xFFFFFFFF //You get exception
TheintegerliteraldoesnotconformtotheexpectedtypeInt
有趣吧? 因此,您可以在Java中执行new java.awt.Color(0xFFFFFFFF, true)之类的操作,但在Kotlin中则不能。
Color类在"二进制"级别上与该int一起使用,因此对于具有所有构造函数(Color(int rgba)或Color(int r, int g, int b, int a))的两个平台,一切都可以正常工作。
我为kotlin找到的唯一解决方法是java.awt.Color(0xFFFFFFFF.toInt(), true)。
知道为什么在Kotlin中会这样吗?
-
我认为Java会自动将数字Int扩展为Long。 ---请参阅kotlinlang.org/docs/reference/basic-types.html ---并另请参见java2s.com/Tutorial/SCJP/0080__Type-Casting/-在Kotlin中,您必须明确地做到这一点,没有语言自动性避免您选择过窄的类型。
-
@Mrre 0xFFFFFFFF是-1作为Int的有效二进制补码表示形式。两种语言之间的区别在于Kotlin文字似乎不接受二进制补码。文字0x80000000是错误(在Java中为Integer.MIN_VALUE)。换句话说,您必须使用一元-运算符来表示否定文字。尽管我在两种语言的规范中都找不到对此的任何具体提及。
-
@ bcsb1001请查看Integer.MAX_VALUE
-
那呢我没有发现与我的评论相抵触的任何内容。
-
@ bcsb1001我看不到您的与我的矛盾。看到下面的评论,保罗回答。
-
@Mrre因为没有发生扩大的转换,您似乎建议这样做。
-
@ bcsb1001参见下面的评论,Pauls的回答。
-
@Mrre在将int值应用于int字段方面没有扩大。
-
请参阅describe.kotlinlang.org/t/when-does-bit-fiddling-come-to-kotl in /-当前的总体规划是(...)具有较大的十六进制常量,具有无符号类型(即0xFFFFFFFF不是负整数) ,但未签名的Int,即UInt)。它来自想要保护您免受意外的溢出细微差别的影响,但是使用十六进制的99.9%的时间中,您可能关心的是位,而不是实际值。
这里部分回答:
In Kotlin you need to prepend the - sign to denote negative Int which is not true in Java.
因此,似乎Java会将十六进制文字解释为带符号,而Kotlin会将其视为无符号。
否定将必须手动完成。
除了一点:JetBrains的Kotlin转换器实际上可以转换
至
但这可能仅仅是实现了您已经注意到的东西。
但是,十六进制字面值的规范部分完全没有提到这一点。
我认为,应该通过Kotlin 1.3和UInt解决此问题
在此处查看更多信息:https://kotlinlang.org/docs/reference/whatsnew13.html#unsigned-integers
说明在参考文档中:
Due to different representations, smaller types are not subtypes of
bigger ones. If they were, we would have troubles of the following
sort:
1 2 3 4 5
| // Hypothetical code, does not actually compile:
val a : Int ? = 1 // A boxed Int (java.lang.Integer)
val b : Long? = a // implicit conversion yields a boxed Long (java.lang.Long)
print (a == b ) // Surprise! This prints"false" as Long's equals()
// check for other part to be Long as well |
So not only identity, but even equality would have been lost silently
all over the place.
As a consequence, smaller types are NOT implicitly converted to bigger
types. This means that we cannot assign a value of type Byte to an Int
variable without an explicit conversion.
-
这不是问题。 在Java中,0xFFFFFFFF仍将是int。 另外,int绝对不大于long
-
是的,我敢肯定。 当0xFFFFFFFF解释为带符号时,显然是-1(是32位)。
-
链接答案中的此评论是否有帮助?"您可以编写int i =(int)Long.MAX_VALUE;它将为-1。我同意这很奇怪,因为编译器抱怨int i = 4294967295;但没有抱怨int i = 0xffffffff;。我认为, 基本上这是因为0x ...被视为位序列,然后转换为所需的类型。"
-
但是,公平地讲,这个答案并不涵盖这个问题。 留下它来累积票数:)
-
该评论实际上正是我的意思。 0xFFFFFFFF是int。 与0b11111111111111111111111111111111相同,当被视为32位整数时,高位为1,由于有符号整数的表示,其值为-1。 当被视为任何更宽泛的类型(即0xFFFFFFFFL)时,该值当然是正的(请参阅此答案)