2015-07-09 77 views
3

请注意我不在寻找代码来将double或int缩小为int。管理缩小双向int的规则

作为每JLS - $ 5.1.3 Narrowing Primitive Conversion

带符号的整数的一种积分类型T ,缩小转换简单地丢弃所有,但n个最低阶位,其中n是用于表示类型T.比特数

所以,当我尽力缩小一个260(二进制表示为100000100),以一个字节然后结果是4,因为最低8位是00000100这是一个十进制4或长值4294967296L(二进制表示100000000000000000000000000000000)将字节则结果为0。

现在,为什么我想知道缩小双重规则为int的规则,字节等是当我缩小一个double4294967296.0那么结果是2147483647但是当我缩小长4294967296L值然后结果是0

我已经理解了对int,byte等的长期缩小(抛弃了所有的n个最低位),但是我想知道在双缩小的情况下会在什么情况下进行。

+5

答案是在你引用的那行之后有几行:_将浮点数转换为整型T需要两步:[...] _ –

+0

我确实读过它,但我真的无法从中得到答案。我可以理解,它会从1.b完成,但无法理解。如果你可以请投掷灯光,我会非常感激。 – hagrawal

+0

我认为它会在某种程度上理解双重浮动缩小规则,受IEEE 754四舍五入。 – hagrawal

回答

1

我已经理解了长整数,字节等(丢弃所有n位最低位),但我想知道什么是去的在双重缩小的情况下在引擎盖下。

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

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

    • 为NaN变为零
    • 一个INF变为 “MAX-INT” 或 “分钟-INT”
    • 否则:
      • 轮向零到得到某个整数
      • 如果圆形数字是太大的int,结果变成“分钟-INT”或“MAX-INT”
  2. “如何”是特定于实现的。有关如何实现可能是的示例,请查看Hotspot源代码(OpenJDK版本)或让JIT编译器转储一些本机代码供您查看。 (我想,本地代码映射使用单个指令来做实际的转换......但我没有检查)

  3. “为什么”是不可知的......除非你可以问一个原始的Java设计师/规范作者。一种可能的解释是以下的组合:

    • 很容易理解
    • 它与C/C++一致,
    • 可以在共同的硬件平台有效地实现,并且
    • 最好是而不是设计者考虑的(假设)替代方案。

    (例如,投掷为NaN的异常,天道酬勤,外的范围将是与其他原语转换不一致,并且可能是实现起来比较昂贵。)

+0

感谢您的意见。哦好吧。我现在明白了。我想我因为写在JLS中而感到困惑(或者可能存在混淆)。如果我的理解错误,请纠正我 - 按照算法的步骤,#1的第3项“否则,以下两种情况之一必须为真:”将在浮点数为无穷时执行(这意味着FALSE为如果结果不能表示为long或int,则在#2中进行四舍五入后进行第二个项目符号#)。 – hagrawal

+0

如果你能让我知道你的输入,那么我们可以关闭它。请让我知道,如果上面的评论不清楚给你。 – hagrawal

+0

我已经关闭它。但一旦你没有时间,请让我知道你的投入。 – hagrawal

1

将double转换为整数时,结果为Integer.MAX_VALUE,并且该值超出整数的范围。 Integer.MAX_VALUE是2^31 - 1.

+0

如何以及为什么是这个问题。 – hagrawal

+0

规范没有说明为什么,它只是说这是结果。 – stark

+0

是的,我同意,但我想了解为什么和如何部分。 – hagrawal

1

当您以double值4294967296.0开头时,它大于最大的long值,即2147483647,因此应用以下规则(从您引用的页面开始):The值必须太大(大数值的正值或正数的无穷大),并且第一步的结果是int或long的最大可表示值,并且您得到0x7FFFFFF = 2147483647

但是当您尝试转换4294967296L = 0x100000000,你从一个整型开始,所以规则是:将有符号整数缩小到整数类型T只是简单地丢弃除n个最低位之外的所有位所以如果n是小于32(8字节),你刚刚得到一个0.

+0

谢谢您的输入。如果按照上面提到的算法进行操作,那么这是真实的“如果浮点数不是无穷大,则浮点值将四舍五入为整数值V,并使用IEEE 754轮到零模式向零舍入”因为我的电话号码是4294967296.0,这不是无用的。这意味着现在使用IEEE 754 round-to-zero模式将会趋于零。没有? – hagrawal

+0

Long.MAX_VALUE = 9223372036854775807 – stark