在Kotlin中写入一个等于Int.MIN_VALUE的十六进制整数字面值

如何在Kotlin中写入一个等于Int.MIN_VALUE (十进制数为-2147483648 )的十六进制整数文字?

AFAIK,一个Int是4个字节…有时好像2的补码用来表示整数…但是我不确定。 我已经尝试了下面的十六进制文字来帮助我自己理解系统:

  • 0xFFFFFFFF但这是一个Long ,而不是一个Int
  • 0xFFFFFFFF.toInt()这是-1
  • -0xFFFFFFFF.toInt()这是1
  • 0x7FFFFFFF这是2147483647这是Int.MAX_VALUE
  • -0x7FFFFFFF这是-2147483647这是Int.MIN_VALUE+1
  • 0xFFFFFFF ,十进制是268435455
  • 0x0FFFFFFF也是十进制的268435455

但我不知道什么十六进制整数文字可以用来表示Int.MIN_VALUE

我希望答案不会让我感到愚蠢

Int代表一个32位有符号整数。 32位表示8位十六进制数字:

___7 FFFFFFF

0111 1111 1111 1111 1111 1111 1111 1111

正如你所看到的,最左边的位是0,因此这是32位表示中的一个正整数。 通过2的补码定义和例子,最小的32位负值将在最左边的位处有1 ,然后是0

1000 0000 0000 0000 0000 0000 0000 0000

___8 0 0 0 0 0 0 0

那就是0x80000000

在Kotlin中,您需要预先加上-符号来表示负的Int ,这在Java中是不正确的。 考虑下面的例子

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

这在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) 

这符合Kotlin规范,尽管十六进制文字的溢出行为还没有被定义 。

进一步阅读:

  • 为什么Java能够将0xff000000存储为int?