纯粹作为附录或替代观点,Fortran 变量是根据分配给 var 的内存字节数定义的。事实上,所有可比较的编译器都根据分配的字节数来定义 vars,否则系统将很难在内存中分配/存储,并且如果没有这些,就很难执行算术等。
对于像我这样的一些人来说,使用稍旧的符号(而不是“kind konfusion”)更容易看到发生了什么。特别是,很多编译器提供了 Kind 和 bytes 之间的直接 1:1 对应关系/var,然后使最大/最小整数的计算相当简单(一些编译器使用非线性或非直接对应)。但请务必注意最后的可移植性帮助。例如
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
类似的符号适用于其他 Fortran 类型(Real、Logical 等)。如果未指定“大小”,则所有 var 类型都有一个默认分配的字节数。
特定类型的最大字节数还取决于编译器和系统(例如,Integer(16) 并非在所有系统上都可用,等等)。
一个字节是 8 位,所以一个字节应该能够容纳最大值 2^8 = 256 如果从 1 开始编号,或 = 255 从 0 开始。
但是,在 Fortran 中,(几乎所有)数字变量都是“有符号的”。这意味着在位表示中的某处需要一位来跟踪该数字是 +ve 数字还是 -ve 数字。因此,在本例中,最大值为 2^7,因为“符号”信息的一位“丢失/保留”。因此,带符号的 1 字节整数的可能值为 -127:+128(注意 Abs(limits) 总和为 255,因为“0”占据了一个位置,总共 256 个“事物”,因为它应该是)。
类似的规则适用于所有此类变量,只是指数“n”,在 2^n 中,根据字节数而变化。例如,一个 Integer(8) var 有 8 个字节或 64 位,其中 1 位丢失/保留用于符号信息,因此如果从 1 开始编号,则最大可能值为 2^63 = 9223372036854775808,或者在开始时 = 4611686018427387904从 0 开始。
标准的整数数据模型可以概括为:
IntNum = s * Sum[ w(k) * 2 ^ (k-1), k=1:(NumBytes*8)-1],
其中 s = "sign" (+/-1),对于第 k 位值,w(k) 为 1 或 0。
不需要在类型声明中使用显式数字或环境变量;允许使用用户定义的编译时间常量(即参数)。例如
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.
由于 Parameter 语句可以在另一个通过 Use 等访问的模块中,重新编译大型复杂代码以获得所需的“精度”的替代定义是一件简单的事情。例如,如果将 DP 编辑为 Kind(1.0),则应用该声明的任何地方都将变为“单精度”Real。
Fortran 内部函数 Huge()、Tiny() 等有助于确定给定系统上的可能性。
使用 Fortran“位”内在函数和其他工具/方法可以完成更多工作。