有关Java 中补码的问题

来源:百度知道 编辑:UC知道 时间:2024/05/06 15:04:54
byte number = 2;
System.out.println((int)(~number));
结果为-3;

byte number = -3;
System.out.println((int)(~number));
结果为2;
请大哥讲解一下这两个结果都是怎么得出来的,详细些
如:从2在内存中是00000010开始
byte number = 2;
System.out.println((int)(~number));
结果是 -3

byte 占内存一个字节,存储的2在内存中是0000 0010,经补码运算 ~ 就变成了1111 1101,
问题就是 1111 1101是-3吗
1111 1101 除符号位取反 变成 1000 0010 再加1 变成 1000 0011 这下就是-3 了 应该是这样吧

byte number = -3;
System.out.println((int)(~number));
问题是 这个 -3 变成 2的过程是如何的?

详细过程如下:
⑴2的补码为0000 0010
按位求反后变为1111 1101
因为此数为负数,将这个结果从补码变为原码:
1、先求反,最高位(符号位)不变:1000 0010
2、再加1:1000 0011;
结果即为-3
⑵-3的原码为1000 0011
补码为1111 1101
按位求反后得到:0000 0010
因为此数为正数,所以原码就是其本身:0000 0010
结果即为2

关键是要理解运算时都是用补码形式,而求反符号是按位求反,因此符号位也改变了。

补码就是各位相反,首位是正负标记