Java 将double缩小为int的规则

Java 将double缩小为int的规则,java,Java,请注意,我不是在寻找代码来转换或缩小双精度到int的范围 依照 有符号整数到整数类型T的缩小转换 只需丢弃除n个最低阶位以外的所有位,其中n是数字 用于表示类型T的位的数目 因此,当我尝试将260(二进制表示法为1000000000)缩小到一个字节时,结果是4,因为最低的8位是00000100,它是十进制4或长值4294967296L(二进制表示法为1000000000000000000000000),结果是0 现在,为什么我想知道将规则从double缩小到int、byte等的规则是当我缩小一个

请注意,我不是在寻找代码来转换或缩小双精度到int的范围

依照

有符号整数到整数类型T的缩小转换 只需丢弃除n个最低阶位以外的所有位,其中n是数字 用于表示类型T的位的数目

因此,当我尝试将260(二进制表示法为
1000000000
)缩小到一个字节时,结果是4,因为最低的8位是
00000100
,它是十进制4或长值4294967296L(二进制表示法为
1000000000000000000000000
),结果是0

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


我已经理解了将长窄化为int、byte等(丢弃除n个最低阶位以外的所有位),但我想知道在双窄化的情况下会发生什么。

将双精度转换为整数时,结果是Integer.MAX\u值,并且该值超出了整数的范围。Integer.MAX_值为2^31-1。

当您从双精度值4294967296.0开始时,它大于最大长值2147483647,因此应用以下规则(从您引用的页面开始):该值必须太大(大幅度的正值或正无穷大),第一步的结果是int或long类型的最大可表示值,得到0x7FFFFFF=2147483647

但是,当您尝试转换4294967296L=0x100000000时,您从整数类型开始,因此规则是:有符号整数到整数类型T的窄化转换只会丢弃除n个最低顺序位以外的所有位,因此如果n小于32(8字节),则只会得到0

我已经理解了将长窄化为int、byte等(丢弃除n个最低阶位以外的所有位),但我想知道在双重窄化的情况下会发生什么

。。。我想了解为什么和如何部分

  • JLS()指定结果是什么。简化版本(适用于
    int
    )为:

    • 一个NaN变成零
    • Inf变为“最大整数”或“最小整数”
    • 否则:
      • 向零取整得到一个数学整数
      • 如果四舍五入的数字对于
        int
        而言太大,结果将变为“min int”或“max int”
  • “如何”是具体实施的。有关如何实现它的示例,请查看热点源代码(OpenJDK版本)或让JIT编译器转储一些本机代码供您查看。(我想象本机代码映射使用一条指令进行实际转换……但我还没有检查。)

  • “为什么”是不可知的。。。除非您可以询问一位原始Java设计人员/规范作者。合理的解释是以下因素的组合:

    • 这很容易理解
    • 与C/C++、一致
    • 它可以在通用硬件平台上高效实现,并且
    • 这比设计师考虑的(假设的)备选方案要好
    (例如,为超出范围的NaN、Inf抛出异常将与其他原语转换不一致,并且实现起来可能更昂贵。)


  • 答案是在你引用的那一行后面的几行:将浮点数缩小为整数类型T需要两个步骤:[……]我确实读过,但我真的无法从中得到答案。我可以理解它将从1.b开始执行,但无法理解如何执行。如果你能解释一下,我将不胜感激。我想最终会理解IEEE 754四舍五入规定的双浮变窄规则。@hagrawal:“该值必须太大(大幅度的正值或正无穷大),第一步的结果是int或long类型的最大可表示值。”..@OliverCharlesworth感谢您的输入。如果我使用上面提到的算法,那么这是真的“如果浮点数不是无穷大,则浮点值被四舍五入为整数值V,使用IEEE 754向零舍入模式向零舍入”,因为我的数字是4294967296.0,这不是无限的。这意味着现在将使用IEEE 754向零舍入模式向零舍入。否?问题是如何和为什么。规范没有说为什么,只是说这是结果。是的,我同意,但我想了解为什么和如何部分。页面上说:“值必须太大(大幅度的正值或正无穷大),第一步的结果是int或long类型的最大可表示值。”“我不确定这里的情况是否如此,我也发表了同样的评论。谢谢你的意见。如果我使用上面提到的算法,那么这是真的“如果浮点数不是无穷大,则浮点值被四舍五入为整数值V,使用IEEE 754向零舍入模式向零舍入”,因为我的数字是4294967296.0,这不是无限的。这意味着现在将使用IEEE 754向零舍入模式向零舍入。否?Long.MAX_VALUE=9223372036854775807感谢您的输入。哦,好的。我现在明白了。我想我之所以困惑是因为JLS中的评论(或者可能有困惑)。如果我的理解是错误的,请纠正我-根据那里的algo步骤,#1“的第三个项目符号,否则,以下两种情况之一必须为真:“将在浮点为无穷大时执行”(这意味着#的第二个项目符号为假)以及在#2中四舍五入后,如果结果不能表示为long或int。如果您可以让我知道您的输入,那么我们可以结束此操作。请让我知道,如果上述评论是不清楚的