print(hex(2))
print(hex(-2))
print('*' * 30)
# python对数据的存储也是使用补码,与c不同的是一个数值占用的字节数是不确定的
a = -2 & 0xffffffff # a为-2的补码,从python存储的-2的补码中只截取低位的32位表示-2的32位补码
print(a) # 4294967295
print(hex(a)) # 0xfffffffe
b = ~(a ^ 0xffffffff) # 将-2的32位补码转换为python存储-2的补码形式。整个过程相当于低32位不变,高位全部变换位1
print(b)
print(hex(b))
补充:补码
要手动获取一个负数的补码,你需要先知道这个负数在二进制下的原码表示,然后按照补码的定义来求得它的补码。负数的原码表示通常是将正数的原码符号位(最高位)变为1。
以下是一个手动获取负数补码的步骤:
- 找到正数的原码:首先,找到这个负数对应的正数的二进制原码表示。
- 转换为负数的原码:将正数的原码的最高位(符号位)设为1,其余位保持不变,得到负数的原码。
- 求反:对负数的原码每一位取反,即0变为1,1变为0。
- 加1:在取反后的结果上加1。
举个例子,假设我们要找到-85的补码(假设我们使用的是8位二进制数):
- 找到正数的原码:85的二进制原码是 01010101。
- 转换为负数的原码:将最高位设为1,得到负数的原码 11010101。
- 求反:对每一位取反,得到 00101010。
- 加1:在 00101010 上加1,得到 -85 的补码 00101011。
注意,这里的结果 00101011 是以8位二进制数表示的-85的补码。在实际的计算机系统中,负数的补码表示通常会利用其符号位(最高位)来表示负数,所以完整的补码表示会包含这个符号位。
另一个重要的点是,由于计算机通常使用固定长度的二进制位来表示整数(如8位、16位、32位或64位),因此在计算补码时,如果最高位发生进位,它会被忽略(因为超出了表示的范围)。这在手动计算时需要特别注意。
在计算机中,补码表示法允许使用相同的硬件和操作来执行加法和减法,因为减去一个数等同于加上这个数的补码。这是补码表示法的一个重要优点。