escriba un literal integer hexadecimal igual a Int.MIN_VALUE en Kotlin

¿cómo se escribe un literal integer hexadecimal que sea igual a Int.MIN_VALUE (que es -2147483648 en decimal) en Kotlin?

AFAIK, un Int es de 4 bytes … y a veces parece que el complemento de 2 se usa para representar integers … pero no estoy seguro. He intentado los siguientes literales hexadecimales para ayudarme a comprender el sistema:

  • 0xFFFFFFFF pero este es un Long , no un Int
  • 0xFFFFFFFF.toInt() que es -1
  • -0xFFFFFFFF.toInt() que es 1
  • 0x7FFFFFFF que es 2147483647 que es Int.MAX_VALUE
  • -0x7FFFFFFF que es -2147483647 que es Int.MIN_VALUE+1
  • 0xFFFFFFF que es 268435455 en decimal
  • 0x0FFFFFFF que también es 268435455 en decimal

Pero no puedo entender qué hexadecimal integer literal se puede usar para representar Int.MIN_VALUE .

Espero que la respuesta no me haga sentir estúpido …

Int representa un integer con signo de 32 bits. 32 bits significa 8 dígitos hexadecimales:

___7 FFFFFFF

0111 1111 1111 1111 1111 1111 1111 1111

Como puede ver, el bit más a la izquierda es 0, por lo tanto, esta es una integral positiva en una representación de 32 bits. Por definición de complemento de 2 y ejemplo, el valor negativo mínimo de 32 bits tendrá 1 en el bit más a la izquierda seguido de 0 :

1000 0000 0000 0000 0000 0000 0000 0000

___8 0 0 0 0 0 0 0

eso es 0x80000000 .

En Kotlin, debe anteponer el signo - para denotar Int negativo que no es verdadero en Java. Considera seguir el ejemplo

 println(0x7FFFFFFF) // -> prints 2147483647 (Integer.MAX_VALUE) println(-0x80000000) // -> prints -2147483648 (Integer.MIN_VALUE) println(0x80000000) // -> prints 2147483648 (does not fit into Int) 

No es lo mismo que en Java:

 System.out.println(0x7FFFFFFF); // -> prints 2147483647 (Integer.MAX_VALUE) System.out.println(-0x80000000); // -> prints -2147483648 (Integer.MIN_VALUE) System.out.println(0x80000000); // -> prints -2147483648 (Integer.MIN_VALUE) 

Esto está en línea con las especificaciones de Kotlin, aunque el comportamiento de desbordamiento de los literales hexadecimales aún no se ha definido .

Otras lecturas:

  • ¿Por qué Java puede almacenar 0xff000000 como int?
  • Kotlin: ¿Por qué el más / less unario no puede inferir el tipo genérico de la asignación?
  • Kotlin: Convertir list grande a sublist de tamaño de partición establecido
  • ¿Se ha generado el método toString para include miembros de la class base?
  • Kotlin de Java: ¿admite el campo o no?
  • ¿Cómo sobrescribir el método al crear instancias de objects en Kotlin?
  • Firebase: ¿manera limpia de usar campos enum en Kotlin / Java?
  • Kotlin, adición genérica
  • ¿Por qué Kotlin usa el modificador del operador fuera de la sobrecarga del operador?
  • ¿Qué hay de diferente entre dos constructores?
  • ¿Kotlin tiene un tipo de "rasgo"?
  • Convierta la function de Scala a la function de Kotlin