python ctypes 模块如何将 uint64_t 从 c++func return 转移到 python int,不设置 restype=c_long_long

python ctypes module how to transfer uint64_t from c++func return to python int,not set restype=c_long_long

我使用 python ctypes 模块从 c++ 函数中计算 crc return uint64_t 类型。 在 python 中,我没有设置 restype(c_long_long),我得到一个 python int 值 -870013293,但是设置 restype 的值为 14705237936323208851。 你能告诉我关于 int_val 和 long_val 的关系吗?

这是文档中的内容:https://docs.python.org/3/library/ctypes.html#module-ctypes

Python integers are passed as the platforms default C int type, their value is masked to fit into the C type.

因此,默认值被视为c_int,并且:

Represents the C signed int datatype. The constructor accepts an optional integer initializer; no overflow checking is done. On platforms where sizeof(int) == sizeof(long) it is an alias to c_long.

由于没有溢出,而且数字是有符号的,不是很大的数字,所以可以输出-2,147,483,648到2,147,483,647之间的任意数字。(32位)

如果您知道 return 值将是无符号的并显式键入 c_uint64(通常是 c_ulonglong 的别名),那么您将获得您想要的值。(64位)

ctypes 的默认 return 类型是 c_int,这是一个 32 位有符号值。如果您没有为 64 位值设置 .restype = c_uint64,则 return 值会错误地从 C 转换为 Python。如果以十六进制显示,可以看到该值被截断为 32 位:

>>> hex(-870013293 & 0xFFFFFFFF)  # twos complement representation of a 32-bit negative value
'0xcc24a693'
>>> hex(14705237936323208851)     # the actual return value
'0xcc137ffdcc24a693'

请注意,64 位值的最后 32 位与 32 位有符号值匹配。