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 位有符号值匹配。
我使用 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 位有符号值匹配。