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

时间:2016-07-04 01:22:20

标签: integer hex kotlin

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

AFAIK,Int是4个字节......有时似乎2's complement用于表示整数......但我不确定。我尝试了以下十六进制文字来帮助自己理解系统:

  • 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

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

2 个答案:

答案 0 :(得分:11)

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

___7 F F F F F F F

0111 1111 1111 1111 1111 1111 1111 1111

如您所见,最左侧的位为0,因此这是32位表示中的正整数。根据{{​​3}}定义和示例,最小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)

这与2's complement符合Kotlin spec的溢出行为。

进一步阅读:

答案 1 :(得分:0)

如果你只想要 INT_MIN 值并且你正在谈论一个 4 字节的整数,而且因为之前没有人提到过它,你可以这样写:

println(0x7FFFFFFF.inv()) 

负操作数 ~ (.inv()) 会自动将位从 1 切换到 0(当您 overflow 时会发生这种情况)。