如何在Python中确定一个数字是32位还是64位整数?

3

我希望在Python中区分32位和64位整数。在C语言中,我们可以使用int_64int_32声明变量,非常容易。但是在Python中,我们如何区分32位整数和64位整数呢?


2
你为什么想知道呢?Python的数据类型不能直接映射。 - Chris Morgan
实际上我想要实现UDP Tracker协议,其中它说我需要按照以下方式打包数据[64位数据][32位数据][32位数据]。 - user101847
1
这不是关于Python数据类型的问题,而是关于编码数据以在网络上传输的问题,这是一个完全不同的问题。 - Chris Morgan
不是这样的...实际上在C语言中,我们可以通过声明int_64和int_32数据类型的变量,然后将它们连接起来,就可以得到如上所述的打包数据。但是在Python中,我们无法确定整数是32位整数还是64位整数。我们只能确定数字是整数类型还是长整数类型。但我想问的是,我们能否确定数字是32位整数还是64位整数。 - user101847
1
你不能这样做。在Python中没有这样的东西。在Python 2中,int可以是32位或64位,而long则是任意长度的。你可以确定一个数字是否适合32位或64位,并尝试将一个数字打包成适当大小的二进制格式,但那是一个完全不同的问题。 - Chris Morgan
4个回答

7

不需要。解释器会在幕后处理分配,根据需要有效地将一种类型升级为另一种类型,无需您进行任何显式操作。


但是我需要将数据发送为[64位数据][32位数据][32位数据],那么在Python中该怎么做呢? - user101847
如果我想要检查用户输入的数字是有符号32位还是无符号32位,该怎么办? - Shedrack
1
重要的是你是否将数据序列化为字节。 - Grimmy

5
其他回答中提到的struct模块就是你需要的东西。
以下是一个例子,以便更加清晰明了。
import struct

struct.pack('qii', # Format string  here.
            100, # Your 64-bit integer
            50, # Your first 32-bit integer
            25) # Your second 32-bit integer

# This will return the following:
'd\x00\x00\x00\x00\x00\x00\x002\x00\x00\x00\x19\x00\x00\x00'

请参考格式字符串的文档

5

基本上不需要这么做。没有理由这么做。如果你想处理已知位数的数据类型,请查看numpy数据类型。

如果你想将数据放入指定的格式中,请查看struct模块。


但是我需要将数据打包为[64位整数][32位整数][32位整数]并将其发送到网络上。那么在Python中应该如何实现呢? - user101847
@user101847:想要将数据适配到特定的字节格式与想要知道标准 Python 类型占用多少字节完全不同。对于你的问题,可以查看 struct 模块。 - BrenBarn
我同意可以使用结构体来装载和解压数据,但我们能否将64位整数与32位整数一起打包。就我所搜寻的资料而言,没有办法区分64位整数和32位整数。你可以通过判断数值是int或long类型来确定,但是否有内置函数可以告诉我们这个数字是32位还是64位的整数呢?在C语言中,我们可以通过使用数据类型int_64和int_32来声明变量来实现。 - user101847
@user101847:你不需要区分它们。只需将整数取出并打包到所需的位数中即可。如果需要打包到32位的数字太大而无法容纳在32位中,那么确实会有问题,但这不是因为它“是一个32位整数”。而是因为该数字太大而无法容纳在32位中。 - BrenBarn

1
下面这段来自ipython解释器会话的片段展示了一种测试整数类型的方法。请注意,在我的系统上,int是一个64位数据类型,而long是一个多字类型。
In [190]: isinstance(1,int)
Out[190]: True    
In [191]: isinstance(1,long)
Out[191]: False    
In [192]: isinstance(1L,long)
Out[192]: True

另请参见答案关于sys.getsizeof。 该函数并不完全相关,因为它包括了一些额外的开销字节。例如:

In [194]: import sys    
In [195]: sys.getsizeof(1)
Out[195]: 24
In [196]: sys.getsizeof(1L)
Out[196]: 28

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接