La valeur de selected_int_kind(int16)
apparaît à 1 au lieu de 2. Est-ce un bogue de compilateur?Précision entière dans le Fortran moderne
Dans la sortie suivante, veuillez noter l'écart pour bint
qui est censé être 2 octets, INT16
. (Les annotations < === ont été ajoutées pour plus de clarté.)
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 <===
Le code suivant est fourni pour permettre aux lecteurs d'enquêter sur ce problème. L'affectation en question est à la ligne 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
Grande réponse et belle démonstration. – dantopa