python 中 int 对象是 built-in 对象,可以表示任意长度的整型值,其底层使用变长对象存储整型值,通过移位、拼接等操作合成整型值。
负数
对于负数,内存中存储的是补码,注意不同函数的输出:
a=-1
bin(a) # '-0b1'
hex(a) # '-0x1'
a.to_bytes(4, byteorder='big', signed=True) # b'\xff\xff\xff\xff'
a & 0xffffffff # 4294967295
hex(a & 0xffffffff) # '0xffffffff'
补码的最高位表示符号位,因此当使用 python 按位处理整型时,最高位需要特殊处理(要显式地让变量为负值,否则 python 不知道这个值是负值补码还是正值),比如按位将 a=-1
拷贝到变量 b
:
a = -1
b = 0
for i in range(32):
if (a >> i) & 1:
if i == 31:
# 补码最高位表示符号位,如果是1需要特殊处理
# b 之前为 0xefffffff
# 减去 0x8fffffff 之后为 -1
# 则 b 最终为 -1
b -= (1 << i)
else:
b |= (1 << i)
print(b) # -1
小对象共享
[-5, 256] 之间的小整型值采用预分配对象共享的方式节约内存和减少分配:
a, b = -5, -5
a is b # True
a, b = 256, 256
a is b # True
文档信息
- 本文作者:amagcatdog
- 本文链接:https://amagcatdog.github.io/wiki/python-int/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)