Puramente como adición, o perspectiva alternativa, las variables de Fortran se definen en términos del número de bytes de memoria asignados a la var. De hecho, todos los compiladores comparables definen vars en términos de bytes asignados, de lo contrario sería muy difícil para el sistema asignar/almacenar en la memoria, y muy difícil de realizar aritmética, etc. sin ellos.
Para algunos, como yo, es más fácil ver lo que está pasando utilizando una notación un poco más antigua (en lugar de la "clase konfusion" .En particular, muchos compiladores proporcionan una correspondencia directa 1: 1 entre Tipo y bytes/var, que luego hace que el cálculo del entero más grande/pequeño sea bastante sencillo (algunos compilan utilizando una correspondencia no lineal o no directa). Aunque asegúrese de tomar nota de la asistencia de portabilidad al final. Por ejemplo
Integer(1) :: Int1 ! corresponds to a 1 byte integer
Integer(2) :: Int1 ! corresponds to a 2 byte integer
Integer(4) :: Int1 ! corresponds to a 4 byte integer
Integer(8) :: Int1 ! corresponds to an 8 byte integer
La notación similar se aplica a otros tipos Fortran (Real, Lógica, etc.). Todos los tipos var tienen un número predeterminado de bytes asignados si no se especifica el "tamaño".
El número máximo de bytes para un tipo particular también depende del compilador y del sistema (p. Entero (16) no está disponible en todos los sistemas, etc.).
Un byte es de 8 bits, por lo que un solo byte debería ser capaz de acomodar el mayor valor de 2^8 = 256 si la numeración es de 1, o = 255, cuando se comienza desde 0.
Sin embargo, en Fortran, (casi todos) los vars numéricos están "firmados". Eso significa que en algún lugar de la representación de bit se requiere un bit para rastrear si el número es un número + ve o un número -ve. Entonces, en este ejemplo, el máximo sería 2^7, ya que un bit está "perdido/reservado" para la información del "signo". Por lo tanto, los valores posibles para un entero de 1 byte son -127: +128 (observe que la suma de Abs (límites) es 255, ya que "0" ocupa un lugar, para un total de 256 "cosas", como debería ser ser).
Se aplica una regla similar para todos estos valores variables, con simplemente el exponente "n", en 2^n, que varía en función del número de bytes. Por ejemplo, un entero (8) var tiene 8 bytes, o 64 bits, con 1 bit perdido/reservado para la información del signo, por lo que el mayor valor posible sería 2^63 = 9223372036854775808, si es de 1, o = 4611686018427387904 al comenzar desde 0.
se generaliza el modelo de datos estándar entero como:
IntNum = s * Sum[ w(k) * 2^(k-1), k=1:(NumBytes*8)-1],
donde s = "señal" (+/- 1), w (k) es 1 o 0 para el bit k-ésimo valor.
No es necesario utilizar números explícitos o env vars en las declaraciones de tipo; las constantes de tiempo de compilación definidas por el usuario (es decir, los parámetros) están permitidas. Por ejemplo
Integer, Parameter :: DP = Kind(1.0d0) ! a standard Double Precision/8-byte declaration
Integer, Parameter :: I4B = 4 ! NOTICE, here the "Integer" bit has not been explicitly "sized", so defaults to "Integer(4)"
!
Real(DP) :: ADoublePrecReal ! an 8-byte Real (approx 15 decimal places with exp +/- approx 300, see Real data model)
!
Integer(I4B) :: AStandardInt ! a 4-byte integer.
Desde la declaración de parámetros puede estar en otro módulo accesible a través de uso, etc, es una simple cuestión de volver a compilar código gran complejo para las definiciones alternativas de "precisión" deseada. Por ejemplo, si DP se edita según Kind (1.0), en todas partes en que se aplique esa declaración se convertirá en "precisión única" Real.
Las funciones intrínsecas de Fortran Enorme(), Tiny() etc. ayudan a determinar qué es posible en un sistema dado.
Mucho más se puede lograr con Fortran "bit" intrínsecos y otras herramientas/métodos.
Solo para alguien que se presente mucho más tarde. Si bien no es intrínseco, siempre puede usar '-huge (n)' para calcular el entero más pequeño disponible. – NoseKnowsAll