那篇博客-5的取反是4是正确地讲解,但是2的取反是-3的讲解是错误的(假如还有其他规则我不知道)
这是按位取反的实例package test3;
public class Test {
public static void main(String args[]) throws Exception {
System.out.println(~2);// -3
System.out.println(~(-5));// 4
}
}
这是为什么,为什么2取反是-3?
2在计算机中的补码是 0000 0000 0000 0010
取反: 1111 1111 1111 1101(这一步是计算机进行的操作即~2)
在计算机中所有的数据都是补码表示的,当然你取反,计算机还是认为你是补码(1111 1111 1111 1101是补码)
1111 1111 1111 1101转成成原码(如果你想要知道1111 1111 1111 1101在计算机中到底表示的是什么(这个操作计算机是不会执行的,它只是我们想要知道1111 1111 1111 1101到底表示的是什么,所以才进行的转换):
补码:1111 1111 1111 1101
取反: 1000 0000 0000 0010
加一: 1000 0000 0000 0011
所以结果是-3(补码转源码,符号位不动,其他位取反之后加一)
现在分析-5,首先必须得到-5在计算中是怎么表示的(以下):
原码: 0000 0000 0000 0101
反码: 1111 1111 1111 1010
加一: 1111 1111 1111 1011(这就是计算机中表示的)
-5的取法是对1111 1111 1111 1011(计算机保存的-5二进制表示)进行取反,结果
0000 0000 0000 0100(计算机进行的操作)
0000 0000 0000 0100是什么?我们需要转吗?不需要,这就是4
原码补码互转的规则
正数的原码反码补码一样
负数源码转补码: 负数绝对值的源码的反码加一
负数的补码转源码:符号位不动其他位取反之后加一