原码、反码、补码
无符号用原码
计算机的运算都用的补码
正数
- 原码, 反码,补码都相同
负数
- 反码等于原码符号位不变,其他取反。
- 补码等于反码+1
例子
2的原码为0000 0010, 因为是正数,所以反码、补码都相同为0000 0010。
-2的原码为1000 0010, 最高位1为符号位,1表示负数,0表示正数。所以其反码为1111 1101, 补码为反码+1, 则为1111 1110。
位运算
- 位运算使用的都是反码。
- 位运算如果存在负数,最后都需要还原为原码得到真值。
异或
-2和2做异或
-2补码为1111 1110,2补码为0000 0010, 两者异或得到1111 1100。
因为存在-2,负数,所以需要对结果-1,**然后除了符号位进行取反操作,得到真正的值(原码)**,即对1111 1100减1,得到1111 1011,然后除去符号位取反,得到1000 0100,该值为-4。
位移运算
- 右移运算,>> 低位溢出,符号位不变,并用符号位(正数0补,负数1补)补溢出的高位
- 左移运算,<< 符号位不变,不够部分用0来补
- 位移运算如果存在负数,最后都需要还原为原码得到真值。
1 | 1>>2 |
1的补码为0000 0001, 右移2位,符号位不变,得到0000 0000即为0
1 | 1<<2 |
左移两位,符号位不变,不够的部分0补,得到0000 0100即为4
1 | -2>>2 |
-2的补码为1111 1110,右移2位,符号不变,高位溢出,用符号位1来补,得到1111 1111,然后-1,除去符号位取反还原回原码,1000 0001即为-1.
1 | -2<<2 |
-2的补码为1111 1110,右移2位,符号不变,不够部分用0补,得到1111 1000,然后-1,除去符号位取反得到原码为1000 1000,即为-8。