为什么将除零除以整数基元给出不同的结果?

时间:2016-03-25 20:42:36

标签: java casting binary primitive-types

    System.out.println((byte) (1.0/0));
    System.out.println((short) (1.0/0));
    System.out.println((int) (1.0/0));
    System.out.println((long) (1.0/0));

结果是:

    -1
    -1
    2147483647
    9223372036854775807

以二进制格式:

    1111 1111
    1111 1111 1111 1111
    0111 1111 1111 1111 1111 1111 1111 1111
    0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111

为什么将无穷大转换为int和long整数将符号位保持为" 0",同时将符号位设置为" 1"对于字节和短整数?

1 个答案:

答案 0 :(得分:10)

JLS 5.1.3:

  

将浮点数转换为整数类型T需要两个步骤:

     

在第一步中,浮点数转换为a   long,如果T很长,或者是int,如果T是byte,short,char或int,   如下:

     

如果浮点数是NaN(§4.2.3),则第一个结果   转换的步骤是int或long 0。

     

否则,如果浮点数不是无穷大,则   浮点值四舍五入为整数值V,向四舍五入   零使用IEEE 754舍入零模式(§4.2.3)。然后有   两种情况:

     

如果T很长,这个整数值可以表示为long,   那么第一步的结果就是长值V。

     

否则,如果此整数值可以表示为int,那么   第一步的结果是int值V。

     

否则,以下两种情况之一必须为真:

     

该值必须太小(大幅度的负值或   负无穷大),第一步的结果是最小的   int或long类型的可表示值。

     

该值必须太大(大幅度的正值或   正无穷大),第一步的结果是最大的   int或long类型的可表示值。

     

第二步:

     

如果T为int或long,则转换结果为   第一步。

     

如果T是byte,char或short,则转换结果为   转换为类型T(第5.1.3节)的结果变窄的结果   第一步。

因此,返回int首先将无限双值转换为Integer.MAX_VALUE,然后然后将其转换为byte / short ,取适当数量的低字节(结果得到-1)。转化为intlong没有额外的步骤,但byteshort首先通过int和<{1}} < em>然后byte / short