Java 为什么将零除法转换为整数基元会得到不同的结果?
结果是:Java 为什么将零除法转换为整数基元会得到不同的结果?,java,casting,binary,primitive-types,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 为什么将无穷大转换为整数和长整数会使符号位保持
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
为什么将无穷大转换为整数和长整数会使符号位保持为“0”,而将字节和短整数的符号位设置为“1”
将浮点数缩小为整数类型T需要两个步骤:
在第一步中,将浮点数转换为
long,如果T是long,或者是int,如果T是byte、short、char或int,
详情如下:
如果浮点数为NaN(§4.2.3),则第一个
转换的步骤是整数或长0
否则,如果浮点数不是无穷大,则
浮点值四舍五入为整数值V,向四舍五入
使用IEEE 754四舍五入归零模式(第4.2.3节)归零。还有
两个案例:
如果T是长的,这个整数值可以表示为长的,
那么第一步的结果就是长值V
否则,如果该整数值可以表示为int,则
第一步的结果是int值V
否则,以下两种情况之一必须为真:
该值必须太小(较大的负值或
负无穷大),第一步的结果最小
int或long类型的可表示值
该值必须太大(大幅度的正值或
正无穷大),第一步的结果是最大的
int或long类型的可表示值。
第二步:
如果T是int或long,则转换的结果是
第一步
如果T是byte、char或short,则转换的结果是
将试验结果缩小为T型(§5.1.3)的结果
第一步。
因此,通过返回
Integer.MAX_value
,首先将一个无限大的双精度值转换为int
,然后将其进一步转换为字节
/短
,从而获得适当的低字节数(结果为-1)。对int
和long
的强制转换没有额外的步骤,但是byte
和short
先通过int
,然后到byte
/short我假设它先转换为int
,然后转换为byte
注:Integer.MAX_值是int
最接近无穷大的值。Thx-Peter,但是,将整数、最大值“长”转换为“214783647 L”,是不是?“彼得劳瑞不可能将<代码>(1/0)< /代码>评估为<代码>双< /代码>,然后种姓到字节考虑底部8位?虽然IEEE 754为double
和float
定义了标准,但我发现奇怪的是int
的符号位为0,因为文档没有为int
定义无限规范。您不能将整数。最大值转换为long
。如果类型为long
,则在+Infinity的情况下选择最大可表示值,即long。MAX_value
@DebosmitRayint
最大可表示值的顶部位为0,当转换为short或byte时,顶部的位是1
。我还想提到缩小原语转换+1.
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