在 Kotlin 中编写一个等于 Int.MIN_VALUE 的十六进制整数文字
Posted
技术标签:
【中文标题】在 Kotlin 中编写一个等于 Int.MIN_VALUE 的十六进制整数文字【英文标题】:write a hexadecimal integer literal equal to Int.MIN_VALUE in Kotlin 【发布时间】:2016-11-05 15:49:38 【问题描述】:如何在 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
。
我希望这个答案不会让我觉得自己很愚蠢......
【问题讨论】:
【参考方案1】:如果你只想要 INT_MIN 值并且你在谈论一个 4 字节的整数,并且由于之前没有人提到它,你可以写:
println(0x7FFFFFFF.inv())
neg 操作数~
(.inv()) 会自动将位从 1 切换到 0(当您 overflow 时会发生这种情况)。
【讨论】:
【参考方案2】:Int
表示一个 32 位有符号整数。 32位表示8个十六进制数字:
___7 F F F F F F F
0111 1111 1111 1111 1111 1111 1111 1111
如您所见,最左边的位是 0,因此这是 32 位表示中的正整数。根据2's complement 的定义和示例,最小的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 spec 一致,尽管hexadecimal literals is yet to be defined 的溢出行为。
进一步阅读:
Why is Java able to store 0xff000000 as an int?【讨论】:
那些 github 链接已损坏。 ://以上是关于在 Kotlin 中编写一个等于 Int.MIN_VALUE 的十六进制整数文字的主要内容,如果未能解决你的问题,请参考以下文章
在Kotlin中除以数组的大小,但我得到的是零,甚至数组的大小等于1或更多。