作者:Ax珊 | 来源:互联网 | 2022-12-04 07:20
我正在寻找一种方式来获得(使用Python)(即C型整数最大值和最小值uint8
,int8
,uint16
,int16
,uint32
,int32
,uint64
,int64
从Python的...)。
我期待在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)
我看到了这样的整数值的最大值和最小值,但是由于作者正在寻找Python整数的最小值/最大值,所以有点不同……而不是C整数(来自Python)
我还注意到在python中检测C类型限制(“ limits.h”)?但是,即使它很相关,也不能真正回答我的问题。
1> CristiFati..:
根据:[Python 3.Docs]:数值类型-int,float,complex:
整数具有无限精度。
转换为代码:
>>> i = 10 ** 100
>>> i
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>>> len(str(i))
101
>>> i.bit_length()
333
另一方面,每种C类型都有固定的大小(取决于平台/体系结构),如[CppReference]:基本类型中明确所示。
由于[Python 3.Docs]:ctypes-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
注意事项:
代码依赖于以下事实:对于某个整数类型,其间隔(和限制是间隔的端点)为:
签名 (2的补码):[-(2 bit_size - 1), 2 bit_size - 1 - 1]
未签名:[0, 2 bit_size - 1]
要检查类型的符号,请使用-1(无符号类型将自动将其转换为上限(由于绕线算术))
输出(在下面)有很多重复项,因为某些类型只是对其他类型的“别名”
剩下的任务(创建一个将Python int与ctypes类型限制进行比较的函数,如果不存在则引发异常)的其余部分是微不足道的,所以我没有实现它
这仅出于演示目的,因此我没有进行任何参数检查
输出:
(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)