为什么在Fortran中需要1、2、4、8个字节来存储逻辑变量?

13

我不明白,既然逻辑类型只有“真”和“假”这两种情况,那么为什么在Fortran中我们需要logical(1)logical(2)logical(4)logical(8)

我们只需要1个比特(bit)

能否有人解释一下呢?

2个回答

11
首先,Fortran并没有说我们有逻辑类型占用1、2、4和8个字节,它们肯定不是“logical(1)”,“logical(2)”,“logical(4)”和“logical(8)”。实现可以选择提供这些,并称之为这些名称。
逻辑变量确实只能有两个值。从(F90,尽管F2008在不同的地方说了同样的话)标准4.3.2.2中可以看出:
逻辑类型具有表示真和假的两个值。 处理器必须为逻辑类型的数据提供一个或多个表示方法。每种方法都由一种类型参数的值来表征,该类型参数称为kind类型参数。
[此处和后面的强调原文保持一致。]
对于默认种类的逻辑类型,存储关联规则(14.6.3.1)规定:
(1)默认整数、默认实数或默认逻辑的非指针标量对象占用单个数字存储单元。
(5)类型为[...]非默认逻辑[...]的非指针标量对象占用单个未指定的存储单元,每种情况都不同。

因此,编译器必须提供一个逻辑类型,其大小与整数和实数类型相同,但同样可以提供占用1位、1字节或其他空间的表示形式。对于任何给定表示形式的kind number和size(因此我的第一段:这个问题并不普遍适用),是实现特定的。尽管如此,在Fortran 2023之前,没有SELECTED_LOGICAL_KIND(或类似的)内在函数。
至于为什么多个表示形式可能有用,这归结于提供选择,也许是为了特殊情况,例如数组和理想的内存管理(有些人喜欢玩非便携式技巧)。然而,内存访问/对齐要求表明标量逻辑至少为一个字节(或填充使其相同)。对于C互操作性(F2003+),有一个kind C_BOOL,对应于伴随C处理器的_Bool,它不必是相同的大小。

SELECTED_LOGICAL_KIND 已经在 Fortran 2023 中添加。请参考 https://fortran.bcs.org/2022/AGM22_Reid.pdf 或规范以获取详细信息。 - Jeff Hammond

4

LOGICAL


The FORTRAN standard requires logical variables to be the same size as INTEGER/REAL >variables (see the chapter on memory management) although only one bit is really needed to implement this type.

The values used to implement the logical constants .TRUE. and
.FALSE. differ:

          |    VMS     |    Sun    |   IRIX    |    -----------|------------|-----------|-----------|-----------
.TRUE.    |    -1      |     1     |     1     |    -----------|------------|-----------|-----------|-----------
.FALSE.   |     0      |     0     |     0     |    -----------|------------|-----------|-----------|-----------

Unix machines naturally adopted the C convention, VMS has a seemingly strange value for .TRUE., however on a closer look you will see that
if .FALSE. is "all bits 0", .TRUE. should be "all bits 1", in two's complement signed integers the number with all bits set to 1 is -1.

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

这似乎是为了更简单的内存管理而设计的。

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


实际上,这并不完全正确。据我所知,Fortran标准仅将变量的第一个定义为“有意义”的位。因此,如果您正在测试非零以表示真实值,则不能保证符合标准。如果您将“2”分配给逻辑变量,严格来说,这将被解释为.FALSE.,因为第一个位是零。 - ereisch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接