使用Fortran transfer内在函数转换类型,标准是否规定字节顺序?
Fortran transfer函数转换后的字节顺序标准规定疑问
我使用Fortran的transfer内在函数,将integer(c_int32_t)类型转换为由四个字节组成的pixel派生类型,测试代码如下:
program transfert_ex use iso_c_binding implicit none integer(c_int32_t) :: res type :: pixel integer(c_int8_t) :: r integer(c_int8_t) :: g integer(c_int8_t) :: b integer(c_int8_t) :: alpha end type type(pixel) :: p1, p2 integer(c_int32_t) :: rx = 33 !! 21 integer(c_int32_t) :: gx = 28 !! 1C integer(c_int32_t) :: bx = 128 !! 80 integer(c_int32_t) :: ax = 255 !! FF res = ieor(ishft(rx, 24), ieor(ishft(gx, 16), ieor(ishft(bx, 8), ax))) p2 = transfer(res, p1) !print "(4(z0,1x))", [p2%r, p2%g, p2%b, p2%alpha] print *, ichar(transfer([p2%r, p2%g, p2%b, p2%alpha], 'a', 4)) end program transfert_ex
运行结果为:
211C80FF 255 128 28 33
可见转换后字节顺序完全反转,我在同一小端架构的三款编译器上测试结果一致,想询问Fortran标准是否对转换后的字节顺序有相关规定?
解答
- Fortran标准没有规定
transfer函数转换时的字节顺序,它的行为完全依赖于编译器的内存布局实现。 transfer函数的核心逻辑是按内存中存储的字节原样复制:它会把源对象在内存中的所有字节,直接映射到目标类型的内存空间中,不做任何字节序转换、调整或重新排列。- 你观察到的字节反转现象,本质是小端架构的内存存储特性导致的:小端模式下,整数的最低有效字节(LSB)会被存储在内存的最低地址位置。你的代码中,
ax(值为255,十六进制FF)被放在了整数res的最低位(通过位操作组合),所以它在内存中处于最靠前的地址;当transfer把这些字节复制到pixel类型时,pixel的第一个成员r会读取到这个最靠前的字节,最终就呈现出字节顺序反转的结果。 - 如果需要确保跨编译器或架构的字节顺序一致性,不能依赖
transfer的默认行为,建议手动按指定顺序拆分/组合字节,或者给派生类型添加bind(C)属性来固定内存布局(C语言的结构体布局有明确规定)。
内容的提问来源于stack exchange,提问作者aitzkora
相关产品推荐
相关产品推荐

