selected_int_kind(r)按所需十进制整数范围选择可用的最小integer kind,使该kind至少能表示-10^r到10^r之间的全部整数。
可以用于计数器、网格编号和大规模粒子数量。适合按范围需求声明整数,应当检查负返回值避免把不受支持的结果继续当作kind使用。
语法结构
integer, parameter :: ik = selected_int_kind(r)
integer(kind=ik) :: value
value = integer_literal_ik
- r是标量整数,表示所需十进制范围,而不是字节数。
- 若存在多个满足要求的integer kind,返回十进制范围最小的一个;若没有任何kind满足,返回负值。
- 超出默认整数范围的字面量也要带目标kind后缀,否则编译器可能在赋值前就按默认整数解析失败。
本文代码
program selectedIntKindDemo
implicit none
integer, parameter :: idKind = selected_int_kind(9)
integer, parameter :: populationKind = selected_int_kind(12)
integer, parameter :: unavailableKind = selected_int_kind(100)
integer(kind=populationKind) :: particleCount
particleCount = 8000000000_populationKind
print "(A,I0)", "至少9位整数的kind:", idKind
print "(A,I0)", "至少12位整数的kind:", populationKind
print "(A,I0)", "粒子数:", particleCount
print "(A,I0)", "该kind可表示的最大整数:", huge(particleCount)
print "(A,I0)", "要求100位时的返回值:", unavailableKind
end program selectedIntKindDemo
编译运行
(base) hong@hongdeMacBook-Pro 063.selectedIntKind % gfortran -Wall -Wextra -std=f2018 exampleSelectedIntKind.f90 -o selectedIntKindDemo
(base) hong@hongdeMacBook-Pro 063.selectedIntKind % ./selectedIntKindDemo
至少9位整数的kind:4
至少12位整数的kind:8
粒子数:8000000000
该kind可表示的最大整数:9223372036854775807
要求100位时的返回值:-1
现象分析
本机kind=4已满足9位十进制范围,12位需求则选择kind=8。粒子数8,000,000,000超过常见32位有符号整数上限,因此使用populationKind声明并给字面量添加后缀。
huge(particleCount)得到9,223,372,036,854,775,807,证明所选kind覆盖12位需求。具体kind标签4和8仍由编译器决定。
selected_int_kind(100)返回-1,表示当前处理器没有满足100位范围的整数kind。负返回值只能用于检测,不用于integer(kind=…)声明。
核心知识点
- selected_int_kind按十进制范围需求选择integer kind。
- 返回的正kind标签不可硬编码;负值表示没有可用kind。
- 大整数字面量必须在解析时就带正确kind后缀。