**1. “多重转型”问题
System.out.println((int)(char)(byte)-1);
System.out.println((int)(char)(byte)1);
输出
65535
1
解析“多重转型”问题
连续三次类型转换的表达式如下:(int)(char)(byte)-1
1. int(32位) -> byte(8位)
-1是int型的字面量,根据“2的补码”编码规则,编码结果为0xffffffff,即32位全部置1.转换成byte类型时,直接截取最后8位,所以byte结果为0xff,对应的十进制值是-1.
2. byte(8位) -> char(16位)
由于byte是有符号类型,所以在转换成char型(16位)时需要进行符号扩展,即在0xff左边连续补上8个1(1是0xff的符号位),结果是0xffff。由于char是无符号类型,所以0xffff表示的十进制数是65535。
3. char(16位) -> int(32位)
由于char是无符号类型,转换成int型时进行零扩展,即在0xffff左边连续补上16个0,结果是0x0000ffff,对应的十进制数是65535。
- **2. -5 如何用二进制表示
4、负数表示
负数对应的正数的二进制-1,然后取反。
-6
0000-0000 | 0000-0000 | 0000-0000 | 0000-0110 | 6 |
1111-1111 | 1111-1111 | 1111-1111 | 1111-1001 | 取反 |
1111-1111 | 1111-1111 | 1111-1111 | 1111-1010 | 加1 |
5. 负数的存储原理
6. -128的由来