我不明白,因为逻辑类型只有两个个案:true
和false
,所以我们需要{{1 Fortran中的}},logical(1)
,logical(2)
,logical(4)
?
我们只需要logical(8)
。
有人可以解释一下吗?
答案 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的值。和
。假。不同:Unix机器自然采用了C约定,VMS有一个貌似 .TRUE。的奇怪价值,但仔细看你就会看到 如果.FALSE。是“所有位0”,。TRUE。两个应该是“所有位1” 补码有符号整数,所有位设置为1的数字为-1。| VMS | Sun | IRIX | -----------|------------|-----------|-----------|----------- .TRUE. | -1 | 1 | 1 | -----------|------------|-----------|-----------|----------- .FALSE. | 0 | 0 | 0 | -----------|------------|-----------|-----------|-----------
http://www.ibiblio.org/pub/languages/fortran/ch2-3.html
它看起来更简单的内存管理