【问题标题】:Why can not use hex Int in kotlin method intArrayOf?为什么不能在 kotlin 方法 intArrayOf 中使用 hex Int?
【发布时间】:2019-11-12 04:19:08
【问题描述】:

我在 Kotlin 中发现了一个奇怪的问题。

我可以将一个十六进制整数赋给一个 Int 变量,就像:

private val a = 0xFFFF0000    //works good

但我不能在intArrayOf 中使用这个十六进制整数:

private val array: IntArray = intArrayOf(0xFFFF0000)

IDE 提示:整数文字不符合预期的 Int 类型

有人知道为什么吗?无论如何在intArrayof中使用0xFFFF0000

【问题讨论】:

    标签: java kotlin int


    【解决方案1】:

    因为0xFFFF0000是Long类型,

    你可以使用private val array: IntArray = intArrayOf(0xFFFF0000.toInt())

    将类型从 Long 更改为 Int

    或声明LongArray类型

    点赞private val array: LongArray = longArrayOf(0xFFFF0000)

    【讨论】:

    • 我发现private val a: Int = 0xFFFF0000 不行。 0xFFFF0000 是Long 类型是对的,我明白了原因。但是,为什么0xFFFF0000Long 类型,我认为是Int 类型。
    • 如果第一个十六进制数字是 8 或更高,则正数太大而无法放入 Int。 Kotlin 处理这与 Java 不同,后者让数字环绕为负数。这被 JetBrains 团队认为是一个错误,但这是他们六年来未修复的错误:youtrack.jetbrains.com/issue/…
    【解决方案2】:

    虽然0x7FFF_FFFF 是典型的Int,但从0x8000_0000 开始的十六进制文字是Long 类型。

    您需要 32 位来存储 0x8000_0000。虽然 Int 已签名,但该值(即最小的一个)太大而无法存储在 Int 中。

    你可以使用负十六进制文字

    val a: IntArray = intArrayOf(-0x1_0000)
    

    如果你在JVM上,你可以检查

    a.forEach { println(Integer.toHexString(it)) }
    assert(0x7FFF_FFFF == Integer.MAX_VALUE)
    assert(-0x8000_0000 == Integer.MIN_VALUE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      • 2016-06-15
      • 2023-01-30
      相关资源
      最近更新 更多