在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?