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 <===
提供以下代码以允许读者调查此问题。有问题的转让在第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