![](/img/trans.png)
[英]What's the difference between ctypes.POINTER(ctypes.c_int) and ctypes.c_int * 5?
[英]When I use ctypes.c_int() it returns a different number?
当我使用下面的代码时,它返回一个不同的数字。
numb = 5000000000
n = ctypes.c_int(numb)
它转换的数字:705032703
5,000,000,000 对于 32 位 integer 来说太大了。 您可以在下面看到它只是截断为 32 位:
>>> n=5000000000
>>> hex(n)
'0x12a05f200' # 33 bits
>>> import ctypes
>>> hex(ctypes.c_int(n).value)
'0x2a05f200' # dropped the 33rd bit
您可以通过与 32 位掩码进行与运算来看到相同的结果:
>>> n & 0xffffffff
705032704
ctypes
公开了与 C 兼容的类型,其中ctypes.c_int()
公开了带符号的int
类型,根据平台的不同,它可以是 32 位或 64 位(甚至可能更窄或更宽)。
在您的实例中,您的c_int
是 32 位类型,并且 32 位带符号的 int 可以包含范围[-2147483648, 2147483647]
或4294967296
个可能的值。
所以它不能按原样保存你的5000000000
(50 亿),它是由实现定义的溢出处理方式。
如果你想保存大量数字,建议使用像c_int64
这样的固定宽度类型,这样你就知道你在处理什么,因为c_int
和c_long
有一些大小保证,但在其他方面是特定于实现/平台的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.