今天看Java写的一个五子棋的游戏源码,发现其中用到了异或来标志棋子的状态,而其中负数异或的结果让我感到有点不解,于是探究了一番。
-1^3=?
byte型的-1在计算机中以补码形式存储,原码为10000001,补码为原码非符号位取反加1,即为11111111。
byte型的3的原码、补码都一样,在计算机中的存储为00000011。
如果用原码与3异或:10000001^00000011=10000010=-2
如果用补码与3异或:11111111^00000011=11111100,为补码形式,减一取反后为10000100=-4
而写个简单的System.out.println(-1^3)得出的结果是-4,所以在计算机中确实是以补码形式运算的。其他的运算也是一样~
这个test虽然很低级,但是很容易被忽略,备忘一下~