integer - 在 fortran 中访问无符号整数值

标签 integer fortran fortran95 fortran2003

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

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 中。

最佳答案

您可以使用 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 平台。

您可以为此函数创建一个通用接口(interface)。
 write (*,*) indx(-2_c_int16_t)

给出 65534

关于integer - 在 fortran 中访问无符号整数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13414792/

相关文章:

java - java中的 "integer"相当于javascript中的什么?

python - 这种对整数进行运算的 numpy 算法偶尔会返回 float ,为什么?

java - 如何检查一个数组中的多个重复项? [准备Java]

fortran - 如何在 Fortran 中处理大整数?

fortran - Fortran 结果中的 FFTW 仅包含零

fortran - 在 Fortran 中编写多个输出文件

fortran - 将字符串内联传递给子例程调用(其中参数已定义长度)会产生意外结果

Java int 到无符号字节

arrays - 在 Fortran 中查找两个数组的交集

python - python中的fortran子例程导入失败