负数的进制表示(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.   负数的存储原理

负数的进制表示(java笔记9)


6.  -128的由来

负数的进制表示(java笔记9)