Java Integer.MAX_VALUE vs Kotlin Int.MAX_VALUE

Я заметил, одна интересная вещь.
Java Integer.MAX_VALUE равен 0x7fffffff (2147483647)
Int.MAX_VALUE Kotlin – 2147483647
но если вы пишете
в Java:
int value = 0xFFFFFFFF; //everything is fine (but printed value is '-1')
в Котлине:
val value: Int = 0xFFFFFFFF //You get exception The integer literal does not conform to the expected type Int

Интересное право? Таким образом, вы можете сделать что-то вроде new java.awt.Color(0xFFFFFFFF, true) на Java, но не в Kotlin.

Класс Color работает с этим int на «двоичном» уровне, поэтому все работает отлично для обеих платформ со всеми конструкторами ( Color(int rgba) или Color(int r, int g, int b, int a) ).
Только обходной путь, который я нашел для kotlin, – java.awt.Color(0xFFFFFFFF.toInt(), true) .

Любая идея, почему это происходит в Котлине?

На это частично ответили:

В Kotlin вам нужно добавить знак - для обозначения отрицательного Int, который не является истинным в Java.

Таким образом, кажется, что Java интерпретирует шестнадцатеричные литералы как подписанные , тогда как Kotlin будет рассматривать их как unsigned.

Отрицание должно быть сделано вручную.

Небольшой вариант: конвертер Kotlin от JetBrains фактически конвертирует

 int a = 0xffffffff; 

в

 var a = -0x1 

но это может быть просто осознание того, что вы заметили.


Эта конкретная часть спецификации (поведение переполнения) для шестнадцатеричных литералов отмечена как TODO , хотя, тем не менее, официальной спецификации для этого пока нет.

Объяснение приведено в справочных документах :

Из-за разных представлений меньшие типы не являются подтипами более крупных. Если бы они были, у нас были бы проблемы следующего вида:

 // 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 

Таким образом, не только личность, но даже равенство было бы потеряно беззвучно повсюду.

Как следствие, меньшие типы НЕ неявно преобразуются в более крупные типы. Это означает, что мы не можем присвоить значение типа Byte переменной Int без явного преобразования.