在使用~时,正数和负数的取反输出是不一样的
System.out.print(~-9);//8
System.out.print(~9);//-10
首先我们要清楚原码和补码的概念
40:
原码:00101000
反码:00101000
补码:00101000
-117
原码:11101011
反码:10010100
补码:10010101
可以看到,对于正数,其原码、反码、补码相同。对于负数,原码中最高位用来表示符号,反码就是除了最高位外,其余位取反,补码就是反码+1,数字在底层都是用补码存储的
正数取反解析:
step 1:先求得该数的原码;
step 2:原码取反得到答案原码;
step 3:答案原码转为补码,最后化为数值。
9的原码为01001
取反10110
转成反码11001
转成补码=反码+1=11010 =-10
负数取反解析:
step 1:先求得该数的原码;
step 2:再求得该数的补码;
step 3:补码取反得到答案补码,最后化为数值。
~-9
9的原码为11001
转成反码10110
转成补码=反码+1=10110+1 = 10111;
取反01000 = 8
总结
正数取反:先写出原码,再整体取反,求得补码为输出值
负数取反:先写出原码,再求补码,再整体取反,求得输出值