与python3相比,整数在python2中受限制
In [1]: bin(-1)
Out[1]: '-0b1'
-1' is represented as
-0b1',
如何将“ -1”编码为像“ 11111111111111111 ......”这样的真实二进制模式?
答案 0 :(得分:2)
为使二进制补码具有任何含义,整数必须为固定长度。 Python的整数不是,因此无法使用这种编码。
Numpy确实使用了这种编码。因此,
import numpy as np
bin(np.uint8(-1))
# => '0b11111111'
bin(np.uint32(-1))
# => '0b11111111111111111111111111111111'
但是,对于Python自己的整数,0b11111111
始终是127
,而不是-1
; 0b11111111111111111111111111111111
始终是4294967295
,而不是-1
。由于Python整数仅受内存限制,因此任何数量的整数都只会产生一个正整数。
将Python整数强制为类似C的结构的另一种方法是struct
,这一次没有外部库。例如
bin(struct.unpack('I', struct.pack('i', -1))[0]) # 32-bit
bin(struct.unpack('B', struct.pack('b', -1))[0]) # 8-bit
您是正确的,Python2整数是有限的,但是它们透明地扩展为long,而长度不是。 Python3没有这种划分。但是,我不知道这种情况会改变我在上面写的内容。