我正在寻找一种方法(使用Python)获取C类型整数(即uint8
,int8
,uint16
,int16
的最大值和最小值,uint32
,int32
,uint64
,int64
...)。
我希望在ctypes
模块中找到它
In [1]: import ctypes
In [2]: ctypes.c_uint8(256)
Out[2]: c_ubyte(0)
In [3]: ctypes.c_uint8(-1)
Out[3]: c_ubyte(255)
但我找不到它。
朱莉娅(Julia)具有出色的功能:
julia> typemax(UInt8)
0xff
julia> typemin(UInt8)
0x00
julia> typemin(Int8)
-128
julia> typemax(Int8)
127
我很确定Python具有类似的功能。
理想情况下,我什至在寻找一种方法来确保可以将给定的Python整数(据说是无界的)安全地转换为给定大小的C类型整数。 如果数字不在预期的间隔内,则应引发异常。
当前溢出不会引发异常:
In [4]: ctypes.c_uint8(256)
Out[4]: c_ubyte(0)
我看到了这样的帖子Maximum and Minimum values for ints,但这有点不同,因为作者正在寻找Python整数的最小/最大值...而不是C整数(来自Python)
我还注意到了Detecting C types limits ("limits.h") in python?,但是,即使它很相关,也无法真正回答我的问题。
答案 0 :(得分:5)
根据:[Python 3.Docs]: Numeric Types - int, float, complex:
整数具有无限精度。
翻译成代码:
>>> i = 10 ** 100 >>> i 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 >>> len(str(i)) 101 >>> i.bit_length() 333
另一方面,每种{em> C 类型都有固定的大小(取决于平台/体系结构),如[CppReference]: Fundamental types清楚所示。
由于[Python 3]: ctypes - A foreign function library for Python没有提及任何有关类型限制的内容(请注意,此处未记录某些内容),因此我们手动进行查找。
code.py :
#!/usr/bin/env python3
import sys
from ctypes import c_int8, c_uint8, c_byte, c_ubyte, c_int16, c_uint16, \
c_int32, c_uint32, c_int, c_uint, c_long, c_ulong, c_longlong, c_ulonglong, \
c_int64, c_uint64, \
sizeof
def limits(c_int_type):
signed = c_int_type(-1).value < c_int_type(0).value
bit_size = sizeof(c_int_type) * 8
signed_limit = 2 ** (bit_size - 1)
return (-signed_limit, signed_limit - 1) if signed else (0, 2 * signed_limit - 1)
def main():
test_types = [
c_int8,
c_uint8,
c_byte,
c_ubyte,
c_int16,
c_uint16,
c_int32,
c_uint32,
c_int,
c_uint,
c_long,
c_ulong,
c_longlong,
c_ulonglong,
c_int64,
c_uint64
]
for test_type in test_types:
print("{:s} limits: ({:d}, {:d})".format(test_type.__name__, *limits(test_type)))
if __name__ == "__main__":
print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
main()
注释:
[-(2 bit_size - 1), 2 bit_size - 1 - 1]
[0, 2 bit_size - 1]
输出:
(py35x64_test) e:\Work\Dev\StackOverflow\q052475749>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" code.py Python 3.5.4 (v3.5.4:3f56838, Aug 8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32 c_byte limits: (-128, 127) c_ubyte limits: (0, 255) c_byte limits: (-128, 127) c_ubyte limits: (0, 255) c_short limits: (-32768, 32767) c_ushort limits: (0, 65535) c_long limits: (-2147483648, 2147483647) c_ulong limits: (0, 4294967295) c_long limits: (-2147483648, 2147483647) c_ulong limits: (0, 4294967295) c_long limits: (-2147483648, 2147483647) c_ulong limits: (0, 4294967295) c_longlong limits: (-9223372036854775808, 9223372036854775807) c_ulonglong limits: (0, 18446744073709551615) c_longlong limits: (-9223372036854775808, 9223372036854775807) c_ulonglong limits: (0, 18446744073709551615)