Skip to content

Instantly share code, notes, and snippets.

@has2k1
Created May 28, 2014 07:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save has2k1/de1a418e2d9b72f345d7 to your computer and use it in GitHub Desktop.
Save has2k1/de1a418e2d9b72f345d7 to your computer and use it in GitHub Desktop.
Understanding fortran integers
! compile and run using either of the following commands
! and investigate the output.
!
! gfortran integer_test.f90; a.out
! gfortran -fdefault-integer-8 integer_test.f90; a.out
program main
implicit none
! define some integer types
integer, parameter :: &
iintegersd = kind(1), &
iintegers1 = selected_int_kind(1), &
iintegers2 = selected_int_kind(2), &
iintegers4 = selected_int_kind(4), &
iintegers8 = selected_int_kind(8), &
iintegers16 = selected_int_kind(16)
! variables to represent the above types
integer :: i
integer(iintegersd) :: id ! kind = 'default'
integer(iintegers1) :: i1 ! kind = 1 byte
integer(iintegers2) :: i2 ! kind = 1 byte
integer(iintegers4) :: i4 ! kind = 2 bytes
integer(iintegers8) :: i8 ! kind = 4 bytes
integer(iintegers16) :: i16 ! kind = 8 bytes
print *, "---- What are the values of kind (bytes for each type) ----"
print *, "i = ", kind(i)
print *, "iintegersd = ", iintegersd
print *, "iintegers1 = ", iintegers1
print *, "iintegers2 = ", iintegers2
print *, "iintegers4 = ", iintegers4
print *, "iintegers8 = ", iintegers8
print *, "iintegers16 = ", iintegers16
print *,
print *, "----- Assign 1 to all integer types -----"
i = 1
id = 1_iintegersd
i1 = 1_iintegers1
i2 = 1_iintegers2
i4 = 1_iintegers4
i8 = 1_iintegers8
i16 = 1_iintegers16
print *, "The variables are:"
print *, "i", i
print *, "id", id
print *, "i1", i1
print *, "i2", i2
print *, "i4", i4
print *, "i8", i8
print *, "i16", i16
print *,
print *, "max values for each variable:"
print *, "huge(i) ", huge(i)
print *, "huge(id) ", huge(id)
print *, "huge(i1) ", huge(i1)
print *, "huge(i2) ", huge(i2)
print *, "huge(i4) ", huge(i4)
print *, "huge(i8) ", huge(i8)
print *, "huge(i16)", huge(i16)
print *,
print *, "test equality:"
if (i == 1) then
print *, "i == 1"
endif
if (i == id) then
print *, "i == id"
endif
if (i == i1) then
print *, "i == i1"
endif
if (i == i2) then
print *, "i == i2"
endif
if (i == i4) then
print *, "i == i4"
endif
if (i == i8) then
print *, "i == i8"
endif
if (i == i16) then
print *, "i == i16"
endif
print *,
print *, "----- Examine selected_int_kind() and kind() -----"
do i=1, 20
if (selected_int_kind(i) > kind(10**i)) then
print *, i, &
selected_int_kind(i), &
kind(10**i), &
' x'
else
print *, i, &
selected_int_kind(i), &
kind(10**i), &
' _/'
endif
end do
end program main
! Lessons learned
!
! integer(kind=8) != integer(kind=kind(8))
! != integer(kind=selected_int_kind(8))
!
! kind=8 -> 8 is the bytes
! kind=kind(8) -> kind(8) returns the "default" bytes
! that store the integer 8
! kind=selected_int_kind(8) -> selected_int_kind(8) returns
! returns the bytes required to store an integer with
! 8 decimal digits i.e the maximum exponent
!
! selected_int_kind(i) >= kind(10^i) because 10^i takes on the
! default integer size even though that may lead to an overflow/
! underflow. kind(10^i) is the same for all values of i, so other
! than kind(1) use a variable i.e. kind(var) or avoid it.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment