负数的进制表示(java笔记9)
**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 如何用二进制表示
取绝对值的二进制 ,取反加1
5 ----
0000 0101
原码
取反 1111
1010 反码
加1
1111 1011 补码
所以
1111 1011 就表示
-5
**3. 1111 1011 对应十进制中的多少 【减一取反】
首位是 1 ,故是负数
减一 1111 1010
取反 0000 0101 ----> 5
加负号
所以答案是 -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的由来