0

我正在使用 os.read() 将文件的二进制内容读入列表。PyPy 似乎已经确定列表的所有元素都是 int 类型。是否可以显式注释变量以使所有元素都被视为 uint64 类型?

编辑:

# Converts 8 characters into a 64 bit unsigned integer
def b64(b):
    v = 0
    for i in range(8):
        v |= ord(b[8-1-i])<<(i*8)

    return v

# The file consists of 64-bit values
# The first value is the length of the file
# Then follow exactly that number of 64-bit values
# The latter are stored in a list, and returned from the function
def unpack(data):
    l = b64(data)
    result = []
    offset = 8
    for i in range(l):
        value = b64(data[offset:offset+8])
        assert value >= 0
        result.append(value)
        offset += 8
    return result

f = os.open(argv[1], os.O_RDONLY)
data = os.read(f, 2**32)
os.close(f)

unpacked = unpack(data)

unpack() 返回的结果应该是一个无符号 64 位值的列表,但现在似乎假设它们是有符号的 32 位值。我尝试使用断言,但没有效果。

我需要类似result = SomeList<UInt64>或类似的东西。后来,我将此列表转换为 UInt64 列表的列表,并且需要确保相同(我的 VM 的语义取决于它)。

4

1 回答 1

1

在 RPython 中,普通 Python 整数会转换为 N 位的有符号值,其中 N = 32 或 64,具体取决于指针大小:

http://rpython.readthedocs.io/en/latest/rpython.html#integer-types

如果您需要超出该范围的内容,请r_uint使用r_uint64.

于 2018-05-13T18:50:16.670 回答