Java语言说明书第60页有关缩短转换(Narrowing Conversion)的文章,有点了解了,但还不是很清除。
溢出处理好像是在编译器内部完成的???以下是翻译
浮点数向整数的缩短转换分两步进行:
1、第一步,如果目标类型T是long就转换为long;如果是byte、short、char和int就转换为int,遵循如下规则:
  浮点数是NaN,第一步转换的结果就是int类型或者long类型的0。
  否则,如果浮点数不是无穷,就舍入为整数类型的V。舍入方式采取IEEE 745向零舍入的方式。然后分为两种情况:
    如果T是long,这个整数值可以做为long表示,那第一步转换的结果就是long类型的V。
    否则,如果这个整数可以做为int表示,那第一步转换的结果就是int类型的V。
  否则,肯定存在下面两种情况之一:
    数值要么非常小(非常大的负数或者负无穷),那第一步转换的结果就是long或者int类型的最小值。
    数值要么就非常大(非常大的整数或者正无穷),那第一步转换的结果就是long或者int类型的最大值。
2、第二步:
  如果T是int或者long,那结果就是第一步转换的结果。
  如果T是byte、char或者short,那结果就是第一步转换结果对类型T做缩短转换。

解决方案 »

  1.   

    我是想了解Java是如何处理此类溢出的???
      

  2.   

    看了《Java虚拟机说明书》中“Java语言编程概念”中对“基本数据类型的变窄转换”的介绍才算明白了。    对于int i = 1000000;
    System.out.println(i*i);
    -----------------------
    -727379968
    -----------------------    的合理解释和过程应该是这样的:
        i设置为1000000,在乘方时Java发现结果(1000000000000)已经超出了int基本数据类型的最大范围(2147483647),于是作了默认的类型提升(type promotion),中间结果做为long类型存放,返回结果时目标数据类型int不能够容纳下结果,于是根据Java的基础类型的变窄转换(Narrowing primitive conversion)规则,把结果宽于int类型宽度的部分全部丢弃,也就是只取结果的低32位,于是就得到了上面的结果。
       下面用一个十六进制表示的例子阐释这个问题
        int i3 = 1000000;
        System.out.println (Long.toHexString (i3*i3).toUpperCase());
        System.out.println (Long.toHexString (i3*i3).toUpperCase());
        System.out.println (Integer.toHexString (i3*i3).toUpperCase());
        System.out.println ((int)i3*i3);
    ---------------------------------------------------
    FFFFFFFFD4A51000
    1000000000000
    D4A51000
    -727379968
    ---------------------------------------------------   截取是非常直观的
    哪位朋友稍微再补充一下我就给分!!!(没办法,我不能给自己分又想结帖)
      

  3.   

    to kypfos:
    交个朋友,送30分你