Cython中的精确宽度整数实际上依赖于平台吗?

2o7dmzc5  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(107)

在Cython中,可以通过从stdint导入来使用精确宽度的整数类型,例如:

from libc.stdint cimport int32_t

查看stdint.pxd,我们可以看到int32_t定义为

cdef extern from "<stdint.h>" nogil:
    ...
    ctypedef signed int int32_t

这是否意味着,如果我在Cython代码中使用int32_t,则此类型只是signed intint)的别名,而实际上可能只有16位宽?
对于所有其他整型,问题都是相同的。

dw1jzc5e

dw1jzc5e1#

他们应该没事。
实际使用的typedef来自C stdint. h头文件,几乎可以肯定它们是正确的。
Cython类型定义

ctypedef signed int int32_t

实际上只是为了让Cython理解该类型是一个整数,并且它是有符号的。它并不是生成的C代码中实际使用的类型。因为它在一个cdef extern块中,所以它告诉Cython“存在这样的typedef”,而不是作为真正的定义。

2vuwiymt

2vuwiymt2#

编号

signed int不是32位宽的平台上,int32_t将被typedef '艾德为实际 * 是 * 32位宽的类型。
如果没有这样的类型可用--例如,在最大int宽度为16的平台上,或者所有int都是64位的平台上,或者CHAR_BIT不等于8的平台上--则不会定义精确宽度类型。(是的,精确宽度类型是 * 可选的 *。这就是为什么还有最小宽度类型的原因。)
免责声明:这是从一个纯粹的C语言的Angular 讲的。我对Cython没有任何经验。但是如果这在Cython中没有被充分地覆盖,那将是非常令人惊讶的(和一个bug)。
正如@JörgWMittag在他的评论中指出的那样,另一种选择当然是简单地不支持signed int不是32位宽的任何平台。

相关问题