为什么我们需要1,2,4,8个字节来存储fortran中的逻辑变量?

时间:2014-03-02 08:37:01

标签: fortran fortran90

我不明白,因为逻辑类型只有两个个案:truefalse,所以我们需要{{1 Fortran中的}},logical(1)logical(2)logical(4)

我们只需要logical(8)

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:9)

首先,Fortran 没有说我们每个逻辑类型分别占用1,2,4和8个字节,它们肯定不是logical(1),{{1} },logical(2)logical(4)。实现可以选择来提供那些,称之为名称。

逻辑变量确实只能是两个值。从(F90,尽管F2008在不同的地方说的相同)标准4.3.2.2:

  

逻辑类型有两个值,表示true和false。

     

处理器必须为逻辑类型的数据提供一个或多个表示方法。每个这样的方法都由一个名为种类类型参数的类型参数的值来表征。

[强调这里,后来逐字逐句。]

对于逻辑类型的默认类型,存储关联规则(14.6.3.1)表示:

  

(1)默认整数,默认实数或默认逻辑类型的非指针标量对象占用单个数字存储单元。
  (5)类型为[..]非默认逻辑[..]的非指针标量对象占用一个未指定的存储单元,每种情况都不同。

因此,编译器必须提供与整数和实数类型相同大小的逻辑类型,但同样地,它可以提供占用1位,1字节或其他任何内容的表示。任何给定表示的类型和大小(因此我的第一段:问题不是普遍有效的)是特定于实现的。也就是说,没有logical(8)(或类似)固有的。

至于为什么多个表示可能有用,这可以归结为提供选择,也许是针对特殊情况,例如阵列和理想的内存管理(有些人喜欢玩非便携式技巧)。但是,内存访问/对齐要求表明标量逻辑至少应为一个字节(或填充使其相同)。对于C互操作性(F2003 +),有一种SELECTED_LOGICAL_KIND对应于伴随C处理器的C_BOOL,它们的大小不必相同。

答案 1 :(得分:3)

  

LOGICAL

     
     

FORTRAN标准要求逻辑变量与INTEGER / REAL>变量的大小相同(参见内存章节)   管理)虽然实际上只需要一位来实现这一点   类型。

     

用于实现逻辑常量.TRUE的值。和
  。假。不同:

          |    VMS     |    Sun    |   IRIX    |    -----------|------------|-----------|-----------|-----------
.TRUE.    |    -1      |     1     |     1     |    -----------|------------|-----------|-----------|-----------
.FALSE.   |     0      |     0     |     0     |    -----------|------------|-----------|-----------|-----------
     Unix机器自然采用了C约定,VMS有一个貌似   .TRUE。的奇怪价值,但仔细看你就会看到   如果.FALSE。是“所有位0”,。TRUE。两个应该是“所有位1”   补码有符号整数,所有位设置为1的数字为-1。

http://www.ibiblio.org/pub/languages/fortran/ch2-3.html

它看起来更简单的内存管理

http://www.ibiblio.org/pub/languages/fortran/ch2-19.html