如果我在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。
答案 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位数据放入小端平台吗?