基本C和Fortran类型的确定长度
我目前正在将32/64位上所有主要操作系统的BLAS/LAPACK(Fortran库)的本机绑定修改为Java库: 但是,我开始遇到一些问题,与UNIX/Windows世界和Fortran/C之间的数据类型差异有关 表和数据类型是非常非承诺的,因为它们的大小不同 Fortran和C的主要操作系统上的基本数据类型实践中是否存在所有位大小的规范源(或者我们可以通过引用权威源创建一个? 或者,至少在C类型方面是Fortran类型 i、 e.用以下列填充表格(开头有几列): (我不确定这是否正确)基本C和Fortran类型的确定长度,c,compiler-construction,64-bit,fortran,C,Compiler Construction,64 Bit,Fortran,我目前正在将32/64位上所有主要操作系统的BLAS/LAPACK(Fortran库)的本机绑定修改为Java库: 但是,我开始遇到一些问题,与UNIX/Windows世界和Fortran/C之间的数据类型差异有关 表和数据类型是非常非承诺的,因为它们的大小不同 Fortran和C的主要操作系统上的基本数据类型实践中是否存在所有位大小的规范源(或者我们可以通过引用权威源创建一个? 或者,至少在C类型方面是Fortran类型 i、 e.用以下列填充表格(开头有几列): (我不确定这是否正确) 在每
在每个JDK附带的
jni_md.h
中,可以根据C原语查找Java类型。您的方法有几个问题
正如@cup在评论中指出的,有一个标准。这给了我们一定程度的安慰(至少对于GCC来说),CBLAS/LAPACKE C API(使用基本C类型)中提到的映射可以通过该编译器跨架构移植。如问题中所述,这实际上是关于位大小的问题,而不是关于语言保证的抽象概念。i、 e
->REAL
float
->双精度
双精度
->INTEGER
int
->LOGICAL
int
在实践中,这意味着唯一的中断是64位Windows上的
long
为32位(64位Linux上为64位),而jint
是根据long
定义的。因此,可以安全地忽略Windows构建期间的数据类型。与C标准一样,Fortran标准不定义语言固有数据类型的大小(以位为单位)。但是Fortran标准几乎不承认比特的存在。祝你好运,但是我认为你缺少了方程中的一个重要元素,即所使用的编译器(版本)。通常情况下,编译器的混合语言编程中包含了类似的内容。例如,在Silverfrost中,它处于混合语言编程/数据类型/基本数据类型下。在旧的ps4(可能还有DVF、CVF和IVF)编译器上,它由程序员指导/使用混合语言编程。不能相信Windows整数是16位的,或者这是一个确保我们读取所有内容的技巧。哈哈,如果你使用的是更高版本的Fortran,他们有ISO_C_绑定,理论上应该是正确的大小。这非常依赖于供应商。例如,IVF+MSC可能与Windows上的gcc/gfortran非常不同。没有通用的ISO_C_绑定,所有这些都会告诉您,特定Fortran实现的种类编号对应于“伴生”C实现中选定的类型。不要错误地认为种类号是字节大小。有时依赖于实现,有时不依赖于实现。Fortran integer ISO_C_BINDINGkind=C_INT
将与CINT
相同,但这不会告诉您这些类型有多少字节。如果您使用kind=C_INT32_T
匹配C类型INT32_T
,您将在Fortran和C中都有一个32字节的整数。但是知道这一点并不能神奇地告诉您Fortran源代码中声明为integer
和real
的变量的大小。如果需要此控件,则需要重写Fortran源代码或编写其声明使用特定类型的粘合接口例程,然后调用库代码。BLAS/LAPACK例程由CBLAS和LAPACKE在C中定义为float/double。这是官方的C API,它不赞成CLAPACK翻译。至于你的其他观点,这就是我在实践中明确要求大小的原因。我的观点是,你应该根据你正在使用的库的规范而不是它所在的系统来编写绑定。您也没有指定是与CBLAS/LAPACKE接口,还是与Fortran 77代码接口(通常使用显式字节计数),或者您是否也在尝试在某些机器上允许扩展精度。无论如何,C的浮点/双精度在几乎所有现代系统上都将是IEEE单精度/双精度,尽管整数大小确实会改变。(与上表不同,在Linux x86_64上,浮点值仍然是32位。)我不知道你要去哪里,也不知道为什么这些都是相关的。如果问题中的数字有误,请更新
OS ARCH Language Type Bits
Linux x86_64 C int 32
Linux x86_64 C long 64
Linux x86_64 C float 32
Linux x86_64 C double 64
Linux x86_64 Fortran LOGICAL 32
Linux x86_64 Fortran INTEGER 32
Linux x86_64 Fortran REAL 32
Linux x86_64 Fortran DOUBLE PRECISION 64
Linux x86_64 Java JNI jint 32
Windows x86_64 Fortran INTEGER 32
Windows x86_64 Java JNI jint 64
...