现代Fortran中的整数精度

时间:2015-09-10 20:04:21

标签: fortran long-integer iso

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

0 个答案:

没有答案