根据
[Python.Docs]: Numeric Types - int, float, complex:
整数具有无限精度。
翻译成代码:
>>> i = 10 ** 100
>>> i
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>>> len(str(i))
101
>>> i.bit_length()
333
另一方面,每种 C 类型都有固定的大小(取决于平台/架构),如 [CPPReference]: Fundamental types 中清楚地显示。
由于 [Python.Docs]: ctypes - A foreign function library for Python 没有提及类型限制(请注意,那里有一些未记录的内容),让我们手动找出它们。
code00.py:
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(*argv):
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} {:03d}bit on {:s}\n".format(" ".join(elem.strip() for elem in sys.version.split("\n")),
64 if sys.maxsize > 0x100000000 else 32, sys.platform))
rc = main(*sys.argv[1:])
print("\nDone.")
sys.exit(rc)
注:
代码依赖于某个整数类型的区间(以及区间端点的极限):
要检查类型的符号,使用-1(由于wrap around arithmetic,它将自动转换为上限,对于unsigned类型)
输出中有很多重复项,因为一些类型只是其他类型的“别名”
你的任务剩下的部分(创建一个函数,将Python int与CTypes类型极限进行比较,并在不匹配时引发异常)很简单,所以我没有实现它
这仅用于演示目的,因此我没有进行任何参数检查
输出:
ctypes.c_
类型中)。使用 https://pastebin.com/cvm95m1x 也可以很容易地将其转换为 C 类型整数并引发异常,但也许这应该成为 Python 核心的一部分。你有什么看法? - sclsctypes.c_types
中添加一个issigned
属性也可能是一个有趣的想法。 - sclsctype_convert
应该返回c_n
。 - CristiFatiNumeric Types [Python 3 docs]
,Fundamental types [CPPReference]
,ctypes [Python 3 docs]
。 - wjandrea