4

如果我c_int8_t在 Fortran 中有一个变量,并且想将底层位解释为无符号整数(用于索引而不是任何算术),那么进行转换的最有效方法是什么?我想做类似的事情

X( some_function( my_c_int8_t_var ) ) = 1

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

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

4

2 回答 2

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 位)时,我会编写一个函数,将 huge(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

最后一种情况仅适用于 little-endian 平台。

您可以为此函数创建一个通用接口。

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

给出 65534

于 2012-11-16T11:58:17.430 回答
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

这行得通吗?对于 little-endian 平台,我应该将 16 位数据放在 i2(1) 还是 i2(2) 中?

于 2012-11-16T13:06:39.767 回答