在 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 关系运算符和Boolean

在Kotlin中除以数组的大小,但我得到的是零,甚至数组的大小等于1或更多。

在 Kotlin 中查询 Androids ContactsContract

android kotlin缓存目录等于null?

在编写 Gradle 插件时我是不是应该影响 Kotlin

使用 Kotlin 编写你的第一个 Firefox WebExtension 扩展