Ale*_*nko 12 java binary casting 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));
Run Code Online (Sandbox Code Playgroud)
结果是:
-1
-1
2147483647
9223372036854775807
Run Code Online (Sandbox Code Playgroud)
以二进制格式:
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
Run Code Online (Sandbox Code Playgroud)
为什么将无穷大转换为int和long整数将符号位保持为"0",而将字符串位设置为"1"以表示字节和短整数?
Lou*_*man 10
将浮点数转换为整数类型T需要两个步骤:
在第一步中,浮点数转换为long(如果T为long)或转换为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).强制类型转换int,并long没有额外的一步,但byte并short走先通过int和然后到byte/ short.