dan*_*opa 0 iso fortran long-integer
值selected_int_kind(int16)显示为1而不是2.这是编译器错误吗?
在下面的输出中请注意其差异bint是2个字节,INT16.(为清楚起见,添加了注释<===.)
compiler version = GCC version 5.1.0
compiler options = -fPIC -mmacosx-version-min=10.9.4 -mtune=core2 -Og -Wall -Wextra -Wconversion -Wpedantic -fcheck=bounds -fmax-errors=5
execution command = ./a.out
Number of bytes in type default = 4
Number of bytes in type int_8 = 1
Number of bytes in type int_16 = 2 <===
Number of bytes in type int_32 = 4
Number of bytes in type int_64 = 8
Number of bytes in type int_a = 1
Number of bytes in type int_b = 1 <===
Number of bytes in type int_c = 2
Number of bytes in type int_d = 4
Value of aint = 1
Value of bint = 1 <===
Value of cint = 2
Value of dint = 4
Value of selected_int_kind ( INT16 ) = 1 <===
Run Code Online (Sandbox Code Playgroud)
提供以下代码以允许读者调查此问题.有问题的转让在第13行.
program bytes
use iso_fortran_env
implicit NONE
integer :: default
integer ( int8 ) :: int_8
integer ( int16 ) :: int_16
integer ( int32 ) :: int_32
integer ( int64 ) :: int_64
integer, parameter :: aint = selected_int_kind ( INT8 )
integer, parameter :: bint = selected_int_kind ( INT16 )
integer, parameter :: cint = selected_int_kind ( INT32 )
integer, parameter :: dint = selected_int_kind ( INT64 )
integer ( aint ) :: int_a
integer ( bint ) :: int_b
integer ( cint ) :: int_c
integer ( dint ) :: int_d
character ( len = * ), parameter :: c_options = compiler_options( )
character ( len = * ), parameter :: c_version = compiler_version( )
character ( len = 255 ) :: cmd = " "
call get_command ( cmd )
write ( *, '( "compiler version = ", g0 )' ) c_version
write ( *, '( "compiler options = ", g0 )' ) trim ( c_options )
write ( *, '( "execution command = ", g0, / )' ) trim ( cmd )
write ( * , 100 ) 'default', sizeof ( default )
write ( * , 100 ) 'int_8', sizeof ( int_8 )
write ( * , 100 ) 'int_16', sizeof ( int_16 )
write ( * , 100 ) 'int_32', sizeof ( int_32 )
write ( * , 100 ) 'int_64', sizeof ( int_64 )
write ( * , 100 ) 'int_a', sizeof ( int_a )
write ( * , 100 ) 'int_b', sizeof ( int_b )
write ( * , 100 ) 'int_c', sizeof ( int_c )
write ( * , 100 ) 'int_d', sizeof ( int_d )
write ( * , 110 ) 'aint', aint
write ( * , 110 ) 'bint', bint
write ( * , 110 ) 'cint', cint
write ( * , 110 ) 'dint', dint
write ( * , 110 ) 'selected_int_kind ( INT16 )', selected_int_kind ( INT16 )
100 format ( "Number of bytes in type ", g0, " = ", g0 )
110 format ( "Value of ", g0, " = ", g0 )
end program bytes
Run Code Online (Sandbox Code Playgroud)
这不是一个错误.标准(Fortran 95 13.14.94,Fortran 2003 13.7.105和Fortran 2008 13.7.146)有这样的说法 selected_int_kind(R):
争论.R应为整数标量.
结果值.结果的值等于整数类型的kind类型参数的值,该值表示-10 R <n <10 R范围内的所有值n ,或者如果处理器上没有这样的类型参数,则结果是-1.如果多个类型参数符合标准,则返回的值是具有最小十进制指数范围的值,除非存在多个这样的值,在这种情况下,返回这些类型中的最小值.
这意味着,如果int16碰巧2在您的平台上,selected_int_kind(2)将返回能够表示范围-100到+100的最小整数种类,这是一个存储大小为1的单字节,因此int8返回值.
下面一个简单程序的输出应该演示如何工作:
Value of int8 1
Value of int16 2
Value of int32 4
Value of int64 8
Value of selected_int_kind(1) 1
Value of selected_int_kind(2) 1
Value of selected_int_kind(3) 2
Value of selected_int_kind(4) 2
Value of selected_int_kind(5) 4
Value of selected_int_kind(6) 4
Value of selected_int_kind(7) 4
Value of selected_int_kind(8) 4
Value of selected_int_kind(9) 4
Value of selected_int_kind(10) 8
Value of selected_int_kind(11) 8
Value of selected_int_kind(12) 8
Value of selected_int_kind(13) 8
Value of selected_int_kind(14) 8
Value of selected_int_kind(15) 8
Value of selected_int_kind(16) 8
Value of selected_int_kind(17) 8
Value of selected_int_kind(18) 8
Value of selected_int_kind(19) 16
Value of selected_int_kind(20) 16
Value of selected_int_kind(21) 16
Value of selected_int_kind(22) 16
This file was compiled by GCC version 5.2.0 using the options -mtune=generic -march=x86-64 -std=f2008
Run Code Online (Sandbox Code Playgroud)