在Python中检测C类型限制("limits.h")?

11

我在Python中编写了一个小测试程序,以便在多种情况下测试一些C函数。这个Python程序使用 ctypes 导入和使用我的C函数。

但是,我还想测试最小值和最大值的情况(例如 limits.hULLONG_MAX)。

但由于这些限制之一可能取决于系统,所以我更愿意避免在程序中对其进行硬编码; 我宁愿动态获取它。

是否可以在Python中获取这些限制值?


1个回答

6
我相信你能够获得最接近的是:
ctypes.sizeof(whatever_type)

这将告诉你类型的字节数。例如,你可以使用ctypes.sizeof(ctypes.c_int)来确定一个字节是4个字节、8个字节还是其他奇怪的数字。


1
或者假设使用二进制补码,并使用相应的无符号类型负值-1,例如c_uint(-1).value表示无符号限制,并将无符号最大值除以2以获取有符号最大值。 - Eryk Sun
@eryksun:我在文档中找到的关于传递超出范围值的信息只有“不进行溢出检查”,因此我不知道 c_uint(-1) 是否受支持。 - user2357112
1
无溢出检查意味着它在不引发异常的情况下进行了溢出。这是我依赖并从源代码中了解到的,但你说得对,文档措辞不当。 - Eryk Sun
1
@user2357112 你的解决方案听起来真的很优雅!@eryksun的解决方案在我的系统上工作。为了获取有符号类型的限制值,一个小技巧就足够了,例如: ctypes.c_uint(-1).value // 2 用于 INT_MAX,而 (-ctypes.c_uint(-1).value) // 2 用于 INT_MIN - vmonteco
2
@vmonteco,它可以在任何由CPython支持的系统上运行。通过PyLong_AsUnsignedLong[Long]Mask设置简单整数ctype的值,然后进行目标C类型的转换。但文档不是很清楚。 - Eryk Sun
@vmonteco - 感谢您上面的评论。我可以问一下为什么必须使用-1来确定这些值吗?我的简短测试表明,没有其他数字可以用来确定TYPE_MIN / TYPE_MAX值。(我自己正在使用位移 - 但这似乎更直接。) - S3DEV

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