我需要在Fortran中将参数从integer(kind=8)
转换为integer(kind=4)
,有没有(简单)方法这样做?
此参数是一个输入数字,如果此数字大于2 ^ 31-1(4字节整数的限制),程序将始终要求一个较小的数字(因此它可以“适合”在这4个字节内),所以我认为这应该不是问题。
要创建任何类型的整数使用
result = int(source, kind=result_kind)
所以你可以做到
result = int(source, 4)
source
可以是任何数字,包括任何类型的整数。
请注意,kind=8
不代表8个字节,kind=4
不代表4个字节。有些编译器根本没有4类和8类。这些号码不便携。不要使用它们。有关详细信息,请参阅Fortran: integer*4 vs integer(4) vs integer(kind=4)。
正如Vladimir F's answer指出的那样,内在函数int
返回所需类型int(i,kind=kind)
的整数值。
当需要某种表达式时(例如在过程参数列表中),这非常有用:
call sub_with_int_i1_arg(INT(int_i2, kind=i1))
但是,如果需要,对整数的内部赋值已经提供了转换:
integer, parameter :: kind1=7, kind2=23
integer(kind1) :: i
integer(kind2) :: j = 85
! The intrinsic assignment
i = j
! is equivalent to
i = INT(j,KIND(i))
! which here is also
i = INT(j,kind1)
end
内在的huge
可能有助于确定i
的范围是否足够大:
if (ABS(j).le.HUGE(i)) then
i = j
else
error stop "Oh noes :("
end if
正如Steve Lionel评论的那样,提议的新Fortran规范引入了内部函数out_of_range
,它也测试了这样的情况:
if (.not.OUT_OF_RANGE(j,i)) then
i = j
else
error stop "Oh noes :("
end if