这是主要方法的类。
import java.util.*;
import java.io.*;
class Main {
public static void main(String args[])
System.out.println((int)(char)(byte)-1);
}
}
请解释如何打印结果“65535”。
答案 0 :(得分:2)
根据 Java语言规范,让我们关注它:
-1
如果整数文字的后缀为ASCII字母
long
或L
(ell),则其类型为l
;否则它是int
(§4.2.1)类型。
所以在十六进制中意味着:
0xFFFFFFFF {int -1}
(byte)0xFFFFFFFF
Narrowing Primitive Conversion(int
至byte
):
将有符号整数缩小为整数类型T只会丢弃除 n 最低位之外的所有位,其中 n 是用于表示类型的位数T.除了可能丢失有关数值大小的信息外,这可能会导致结果值的符号与输入值的符号不同。
0xFFFFFFFF {int -1} → 0xFF {byte -1}
(char)0xFF
Widening and Narrowing Primitive Conversion(byte
至char
):
首先,
byte
通过扩展原始转换(§5.1.2)转换为int
,然后生成的int
转换为char
通过缩小原始转换(§5.1.3)。
Widening Primitive Conversion(byte
至int
):
将有符号整数值扩展为整数类型T只需对整数值的两个补码表示进行符号扩展,以填充更宽的格式。
0xFF {byte -1} → 0xFFFFFFFF {int -1}
Narrowing Primitive Conversion(int
至char
):
将有符号整数缩小转换为整数类型T只会丢弃除 n 最低位以外的所有位,[...]
0xFFFFFFFF {int -1} → 0xFFFF {char 65535}
(int)0xFFFF
Widening Primitive Conversion(char
至int
):
将
char
的扩展转换为整数类型T归零扩展char
值的表示以填充更宽的格式。
0xFFFF {char 65535} → 0x0000FFFF {int 65535}
结果:65535
答案 1 :(得分:1)
char
未签名。 -1
(整数为负数)变为Character.MAX_VALUE
(因为arithmetic underflow)。它相当于
System.out.println((int) Character.MAX_VALUE);
因此你得到(也许是令人惊讶的)65535
。