gpt4 book ai didi

java - 将 double 缩小为 int 的规则

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:42:44 26 4
gpt4 key购买 nike

请注意,我不是在寻找将 double 转换或缩小为 int 的代码。

根据 JLS - $ 5.1.3 Narrowing Primitive Conversion

A narrowing conversion of a signed integer to an integral type T simply discards all but the n lowest order bits, where n is the number of bits used to represent type T.

因此,当我尝试将 260(二进制表示为 100000100)缩小为一个字节时,结果为 4,因为最低 8 位是 00000100,它是一个小数4 或将长值 4294967296L(二进制表示 100000000000000000000000000000000)转换为一个字节,则结果为 0。

现在,为什么我想知道将规则从 double 缩小到 int、byte 等的规则是当我缩小 double4294967296.0 时结果是 2147483647 但当我缩小一个长 4294967296L 值时,结果为 0

我已经理解了对 int、byte 等的 long narrowing(丢弃除 n 个最低位之外的所有位),但我想知道在双重 narrowing 的情况下发生了什么。

最佳答案

I have understood the long narrowing to int, byte etc. (discards all but the n lowest order bits) but I want to know what is going under the hoods in case of double narrowing.

... I want to understand the why and how part.

  1. JLS ( JLS 5.1.3 ) 指定结果是什么。一个简化版本(对于 int)是:

    • 一个 NaN 变为零
    • Inf 变为“max-int”或“min-int”
    • 否则:
      • 向零舍入得到一个数学整数
      • 如果四舍五入的数字对于 int 来说太大,则结果变为“min-int”或“max-int”
  2. “如何”是特定于实现的。有关如何实现它的示例,请查看 Hotspot 源代码(OpenJDK 版本)或让 JIT 编译器转储一些 native 代码供您查看。 (我想 native 代码映射使用一条指令来进行实际转换....但我没有检查过。)

  3. “为什么”是不可知的……除非您可以询问原始 Java 设计者/规范作者之一。一个合理的解释是:

    • 很容易理解
    • 与C/C++一致,
    • 它可以在通用硬件平台上有效地实现,并且
    • 它比设计师考虑的(假设的)替代方案更好。

    (例如,为 NaN、Inf、超出范围抛出异常将与其他原始转换不一致,并且实现起来可能更昂贵。)

关于java - 将 double 缩小为 int 的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31328190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com