You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fortran与C互操作时c_long在32/64位系统定义不一致问题咨询

c_long跨架构长度不一致的根本原因

根源来自C语言long类型的设计约定

C语言标准从未规定long的固定字节长度,仅明确了最小长度要求和各整数类型的大小关系:

  • long的最小取值范围是[-2^31+1, 2^31-1],也就是至少占4字节
  • 必须满足sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)

具体长度由各平台的ABI(应用程序二进制接口)决定,主流平台的约定差异很大:

  • 32位系统普遍采用ILP32模型:int、long、指针均为4字节
  • 64位Linux/macOS等类Unix系统采用LP64模型:long、指针为8字节,int保持4字节
  • 64位Windows采用LLP64模型:long仍为4字节,仅long long和指针为8字节

Fortran的c_long是完全对齐对应平台C语言long的定义,所以必然会出现跨架构长度不一致的问题。

这是ISO_C_BINDING的刻意设计而非缺陷

ISO_C_BINDING模块的核心设计目标是保证Fortran和同系统下的C代码直接交互时类型完全兼容,而非提供跨平台统一长度的整数类型。如果强行把c_long固定为4字节,在64位LP64系统上调用C库的long字段时反而会出现类型不匹配,完全违背了C绑定模块的设计初衷。

如果你需要跨架构长度固定的整数类型,应该使用C标准<inttypes.h>中定义的固定宽度类型,对应Fortran中提供的c_int32_t、c_int64_t这类带明确宽度的kind常量。

为什么c_int、c_double看起来更稳定

这只是主流平台实现的共识,并非强制标准要求:

  • c_double对应C的double,工业界已经普遍统一采用IEEE 754双精度浮点数标准,固定为8字节,所以几乎没有平台差异
  • c_int对应C的int,当前所有主流32/64位通用平台的ABI都约定int为4字节,所以看起来跨架构没有变化,本质上也是平台实现选择的结果

内容的提问来源于stack exchange,提问作者Pap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:45:01