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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:27:25