计算机中存储的数据是按照补码存储的。
怎么样计算补码:
正数的补码是其自身 负数的补码是对原码进行求反加一。如:-6的原码是1000 0110,其中开始的1位符号为,表示是负数;那么-6的反码是除符号外按位求反,得,1111 1001;再加一,得,1111 1010。所以-6,在计算机中实际是1111 1010。也就是说,虽然你在屏幕上看到何输入的都是-6,但是计算机对-6进行任何位操作,那么其实操作的是1111 1010。这里简化了-6只用8位表示。
我的计算机中int型为4字节,那么5的二进制表示是00000000 00000000 00000000 00000101,那么-6的二进制表示是11111111 11111111 11111111 11111010。
主要的位运算有:
按位与 &
按位左移 <<
按位取反 ~
按位或 |
按位右移 >>
按位异或 ^
无符号右移 >>>
这里以取反运算为例。对x取反,其结果表示为整数为 ~(x) = - (x+1)。如~(5) = -(5+1) = -6。
下面解释为什么:
如上面所说,5的二进制表示是00000000 00000000 00000000 00000101,那么按位取反则为11111111 11111111 11111111 11111010,恰好是-6的补码,所以,机器认为~(5) = -6。
同样,~(-6) = 5。同理,-6的表示是11111111 11111111 11111111 11111010,按位求反刚好是5的补码。
再如,按位左移。2147483645 = 01111111 11111111 11111111 11111101。
i = 2147483645 << 1,得到的结果是 i = -6.因为左移一位之后的结果就01111111 11111111 11111111 111111010,恰好是-6的补码。