gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:30:21 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com