-
对于有符号的而言:最高位表示符号位,0表示正数,1表示负数
1----> 原码 0000 0001
-1----> 原码 1000 0001
-
正数的原码、反码、补码都一样
1----> 反码0000 0001 补码0000 0001
-
负数的反码等于符号位不变,其它位取反
-1----> 反码1111 1110
-
负数的补码等于其反码+1
-1----> 补码 1111 1111
-
0的反码、补码都是0
-
在计算机中的运算都是以补码的方式来运算的
- &:两位全为1,结果为1,否则为0(电路串联)
- |:两位有一个为1,结果为1,否则为0(电路并联)
- ^:两位有一个为1,一个为0,结果为1,否则为0 (同为假,异为真)
左移运算符 <<: 符号位不变,低位补 0
右移运算符 >>:低位溢出,符号位不变,并用符号位补溢出的高位 (正数补0,负数补1)
#includeusing std::cout; using std::endl; int main() { cout << (2&3) << endl;//2 cout << (2|3) << endl;//3 cout << (2^3) << endl;//1 cout << (-2^2) << endl;//-4 cout << (6 << 2) << endl;//24 cout << (-6 << 2) << endl;//-24 cout << (15 >> 2) << endl;//3 cout << (-4 >> 2) << endl;//-1 return 0; } 2 0000 0010 3 0000 0011 2&3 0000 0010 2|3 0000 0011 2^3 0000 0001 -2^2 先计算-2的补码与2的补码进行异或运算,得到结果的补码,-1得到反码,再符号位不变,其它位取反得到结果的原码 -2 1000 0010(原码) 1111 1101(反码) 1111 1110(补码) 2 0000 0010(原码、反码、补码) 1111 1100(补码) 1111 1011(反码) 1000 0100(原码) 6 << 2 0000 0110(原码) 0001 1000(左移2位,低位补0) -6 << 2 1000 0110(原码) 1111 1001(反码) 1111 1010(补码) 1110 1000(左移2位,低位补0) 1110 0111(反码) 1001 1000(原码) 15 >> 2 00001111(原码) 00001111(反码) 00001111(补码) 00000011(右移2位,高位补符号位) 00000011(反码) 00000011(原码) -4 >> 2 10000100(原码) 11111011(反码) 11111100(补码) 11111111(右移2位,高位补符号位) 11111110(-1得到反码) 10000001(原码)



