在分析之前必须先明确如下几点:
1.Java是用补码来存储负数的,也就是说我们对一个数进行取反输出,输出的其实是一个在内存中以补码形式所存在的数;
2.原码,反码,补码的转换规则:{
(1)正数的原码,反码,补码完全一样即符号位固定为0数值位相同;
(2)负数的符号位固定为1,由原码转变为补码时的规则如下: {
(1)原码符号位为1固定不变,整数的每一位二进制数位取反得到反码;
(2)反码符号位为1不变,在反码数值位最低位加1,得到补码。
}
}
注:对一个数取反,得到的可不是它的反码哦!
举例:
public class Test{
public static void main(String[] args){
int a = 8;
System.out.println(~a);//测试发现输出-9,而不是大多数人认为的7
}
}
分析:
正数8的二进制表示如下:
00000000 00000000 00000000 00001000 (正数8的原码,补码,反码都是这串二进制数)
对正数8进行取反得:
11111111 11111111 11111111 11110111(*)
可以发现对正数8进行取反后由于符号位变成了1故得到了一个负数然而java存储负数时是用其补码来进行存储的即问题转化为求由于对正数8取反所得的负数存储问题!按照负数原码和补码转化规则:
1.(*)的符号位1不变,其它位取反得到反码:
10000000 00000000 00000000 00001000
2.反码的符号位不变,反码的数值位最低位加1,得到补码:
10000000 00000000 00000000 00001001(该串二进制数即为输出的-9)
以上就是为什么对正数8取反操作后输出的值为-9的原因。
网友评论