补码
正数补码是本身
负数补码是 符号位不变,其余逐位求反再加1。
python中负数补码
python中的正负数[正数]都是以补码的形式存在的。
在c中负数直接使用补码的方式存储的[用2的补码的方式表示负数],但是在python中 是用原码+’-'产生的。而且十进制、十六进制下的负数表示不同。
结果:
a+b就是c的二进制 => -0b11100 => 1 11100
a+b的补码 => 取反加1 => 1 0000000000…00 00011 + 1 => 1 11111…111 00100
为了获得负数(十进制表示)的补码,需要手动将其和十六进制数0xffffffff进行按位与操作,得到结果是个十六进制数,再交给bin()进行输出,得到的才是想要的补码表示。
可理解为舍去32位以上的数字(将32位以上的都变成0)
复原数据
c的补码是1 11111…111 00100
c^0xffffff 0 000…000 11011 => 0b11011
在~之后:1 1111…11 00100(c的补码计算)在python中c是 -0b11100,此处不是补码形式打印,python的二进制而已,如果是bin((c^0xffffff)&0xfffff) 就是1 1111…11 00100
-0b11100的补码就是 1 1111…11 00100
c^0xffffff是将1-32位取反,~是整个取反,将 32 位以上的位取反,即由 0变为 1,1 至 32 位不变