如何在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
。
我希望答案不会让我感到愚蠢...
答案 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 时会发生这种情况)。