访问fortran中的无符号整数值

时间:2012-11-16 10:31:03

标签: integer fortran fortran95 fortran2003

如果我在Fortran中有一个c_int8_t变量并希望将基础位解释为无符号整数(用于索引而不是用于任何算术),那么转换的最有效方法是什么?我想做像

这样的事情
X( some_function( my_c_int8_t_var ) ) = 1

其中X是数组,some_function应返回包含无符号值my_c_int8_t_var的c_int16_t。我已经看过包括transfer,iadd在内的选项(或者我想只是一个带有强制转换和加法的简单条件)但我想知道什么是最有效的方法(这种索引发生在内部循环中)。当然,它不一定是一个函数 - 如果它可以使用内联表达式来完成,那将是很好的。

编辑:如果该方法也适用于其他整数大小,那将是很好的...即,在c_int32_t中获取无符号c_int16_t的内容,并将无符号c_int32_t转换为c_int64_t。

2 个答案:

答案 0 :(得分:3)

您可以使用transfer()ichar()功能。像

这样的东西
X(ichar(transfer(my_c_int8_t_var,"a")))) = 1

例如

 use iso_c_binding
 write (*,*) ichar(transfer(-1_c_int8_t,"a"))

 end

返回255。

如果找不到相应的字符类型(例如16位),我会编写一个函数,为该值添加巨大的(1._my_integer_kind)。

integer function indx(i)
  integer(c_int16_t),intent(in) :: i

  if (i<0) then
    indx = 2*(huge(i)+1) + i
  else
    indx = i
  end if
end function indx

  integer function indx2(i)
    integer(c_int8_t),intent(in) :: i

    indx2 = TRANSFER([i,0_c_int8_t],1_c_int16_t)
  end function indx2

最后一种情况仅适用于小端平台。

您可以为此功能创建通用接口。

 write (*,*) indx(-2_c_int16_t)

给出65534

答案 1 :(得分:0)

怎么样?
integer(c_int16_t) :: i, i2(2)
integer(c_int32_t) :: i32

equivalence (i32, i2)

i2(2) = 0

然后在循环内

i2(1) = i
X(i32) = 1

这会有用吗?我应该将i2(1)或i2(2)中的16位数据放入小端平台吗?