原码、反码、补码:
原码:数据的二进制-10 --> 10001010
计算机只有加法器,其余算法都是用加法模拟的
例:
1 - 1
1 + -1
00000001 + 10000001 = 10000010 -2 原码直接计算错误,
所以直接使用原码在有负数的情况下不适用
反码:
正数的反码就是原码
负数的反码是原码除符号位外,其他位按位求反
补码:数据在内存中都是以补码形式存储
正数的补码就是原码
负数的补码:
1、转换成二进制的原码
2、原码的符号位不变,其他按位求反得到反码
3、反码+1得到补码
例:
-127
1111 1111 原码
1000 0000 反码
1000 0001 补码
0x81 用%nd表示 0000 0000 1000 0001 = 129
特殊:-128 =>(补码)1000 0000
补码转数据:
转之前确认数据类型,无符号的数直接转成十进制
有符号最高位是0的话说明是正数,正数的补码就是原码,直接转十进制
有符号且最高位是1:
1、补码-1得到反码
2、反码的符号位不变,按位求反得到原码
3、原码转换成十进制
位运算符:& | ~ ^ >> <<
先转成二进制再运算
A & B 按位相与
10101101 0xAD
01101110 0x6E
--------
00101100 0x2C
A