代码之家  ›  专栏  ›  技术社区  ›  codekaizen

为什么CLR会溢出Int32.MaxValue->Single->Int32,而JVM不会溢出?

  •  5
  • codekaizen  · 技术社区  · 15 年前

    Int32.MaxValue 变成一个 System.Single

    Int32 i = Int32.MaxValue;
    Single s = i;
    Int32 c = (Int32)s;
    
    Debug.WriteLine(i); // 2147483647
    Debug.WriteLine(c); // -2147483648
    

    我意识到一定是溢出来了,因为 Single Int32 值,然后它就结束了。当我换了 conv.r4 conv.r4.ovf OverflowExcpetion 被扔了。很公平。。。

    然而,当我调查这个问题时,我用java编译了这个代码并运行它,得到了以下结果:

    int i = Integer.MAX_VALUE;
    float s = (float)i;
    int c = (int)s;
    
    System.out.println(i);  // 2147483647
    System.out.println(c);  // 2147483647
    

    int ? 或者它只是 Integer.MAX_VALUE 为了避免溢出?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Matthew Flaschen    15 年前

    这个案子由 §5.1.3

    变窄转换 浮点数到整数 T型分为两步:

    1. 在第一步中,浮点数被转换 如果T是长的,或者是长的 int,如果T是byte、short、char或 内景,如下:
      • 转换的第一步是int
      • 否则,如果浮点数不是 无穷大,浮点值是 使用IEEE 754舍入到零 归零模式(§4.2.3)。那么 有两种情况:
        • 很长,然后是第一个 步长是长值V。
        • 否则,如果该整数值可以表示为int, 那么第一步的结果是
      • 否则,以下两种情况之一必须为真:
        • 该值必须太小(一个较大的负值 或者负无穷大),结果是 int或类型的可表示值 很长。
        • 或正无穷大),结果 int或类型的可表示值 很长。