java 的int类型 32位说明
一、非运算
取反运算,在二进制中 1变0 ,0变1
例: 1 0 1 0 1 0 1 0 取非
0 1 0 1 0 1 0 1
二、我们需要知道 在计算机中正、负数二进制是如何存储的
1、最高位 0表示整数 ,1表示负数
例如
0000 0000 0000 0000 0000 0000 0000 0010 表示 2
1000 0000 0000 0000 0000 0000 0000 0010 表示 -2
2、反码
正数反码 = 正数原码
负数反码 = 负数原码除最高位外各位取反
例如
-2 原码 :1000 0000 0000 0000 0000 0000 0000 0010
-2反码: 1111 1111 1111 1111 1111 1111 1111 1101
3、补码
正数补码 = 正数原码
负数补码 = 负数反码 + 1
例如
-2原码 1000 0000 0000 0000 0000 0000 0000 0010
-2反码 1111 1111 1111 1111 1111 1111 1111 1101 +1
-2补码 1111 1111 1111 1111 1111 1111 1111 1110
4、负数是以补码的形式存储的
三、上面的准备知识了解后,~2 的结果说明
2的 二进制表示 :0000 0000 0000 0000 0000 0000 0000 0010 取反
~2的二进制表示 :1111 1111 1111 1111 1111 1111 1111 1101
转换后 我们现在只需要计算 1111 1111 1111 1111 1111 1111 1111 1101 二进制再转换成十进制就是我们的~2的结果了。
主要注意:
1、反码 和 非运算(~) 是不同的两个操作
反码 :数的最高位符号位是不会变的
非运算:数的最高位符号位是会变的
2、负数的补码 = 负数反码 + 1
负数反码 = 负数原码除符号位取反
3、所有 1111 1111 1111 1111 1111 1111 1111 1101 的十进制值
a、首先判断 符号位 1 是负数
b、这个二进制表示 负数的补码
c、根据负数的补码 得到 负数原码
负数补码 : 1111 1111 1111 1111 1111 1111 1111 1101 - 1
负数反码 : 1111 1111 1111 1111 1111 1111 1111 1100
负数原码: 1000 0000 0000 0000 0000 0000 0000 0011 原码转化成 十进制 -3
至此 得出 ~2 = -3
试一试:~(-3) = 2