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

Eri*_*ric 10 hex integer kotlin

如何在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.

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

mie*_*sol 11

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

___7 F F F F F F F

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)
Run Code Online (Sandbox Code Playgroud)

它与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)
Run Code Online (Sandbox Code Playgroud)

这与Kotlin规范一致,尽管十六进制文字的溢出行为尚未定义.

进一步阅读: