如果我有 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/