【问题标题】:Are exact-width integers in Cython actually platform dependent?Cython 中的精确宽度整数实际上取决于平台吗?
【发布时间】:2022-11-24 19:55:45
【问题描述】:

在 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 int (int) 的别名,实际上可能是 only 16 bits wide

对于所有其他整数类型,问题都是相同的。

【问题讨论】:

  • 你能说出 Cython 官方支持的非 ILP32 或 LP64 的任何架构吗?
  • 我不知道。是否有 Cython 支持的平台列表/声明?
  • @jmd_dk 在文档中找不到突出的一个,但是 Makefile 中的 MANYLINUX_IMAGES 给出了提示:i686、x86_64、aarch64。

标签: c integer cython portability fixed-width


【解决方案1】:

不。

signed int 不是 32 位宽的平台上,int32_t 将被 typedef'ed 为实际上32 位宽。

如果没有这样的类型可用——例如在最大 int 宽度为 16,或所有 int 均为 64 位,或 CHAR_BIT 不等于 8 的平台上——不会定义精确宽度类型。 (是的,精确宽度类型是可选的.这就是为什么还有最小宽度类型的原因。)

免责声明:这是从纯 C 的角度讲的。我对 Cython 没有任何经验。但它会是非常如果 Cython 也没有充分涵盖这一点,那将是令人惊讶的(也是一个错误)。

正如@JörgWMittag 在他的评论中指出的那样,另一种选择当然是不支持signed int 不是 32 位宽的任何平台。

【讨论】:

  • “在 signed int 不是 32 位宽的平台上,int32_t 将被 typedef'ed 为实际类型32 位宽。”考虑到 Cython 实现ctypedef signed int int32_t,你怎么看?我知道它在 C 中是如何工作的,我的问题是特定于 Cython 的。
  • @jmd_dk:那么不支持这样的其他平台。但我敢说你会意识到,以一种比你的精确宽度类型更“响亮”的方式默默地是错误的尺寸。可能在安装 Cython 期间,或者在启动编译器时作为错误消息。
猜你喜欢
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多