Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我们需要1,2,4,8字节来存储fortran中的逻辑变量?_Fortran_Fortran90 - Fatal编程技术网

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

为什么我们需要1,2,4,8字节来存储fortran中的逻辑变量?,fortran,fortran90,Fortran,Fortran90,我不明白既然逻辑类型只有两种情况:真和假,那么为什么我们需要Fortran中的逻辑(1),逻辑(2),逻辑(4),逻辑(8) 我们只需要1位 有人能解释一下吗 合乎逻辑 FORTRAN标准要求逻辑变量的大小与INTEGER/REAL>变量的大小相同(参见关于内存的章节) 管理)虽然实现这一点只需要一点 类型 用于实现逻辑常量的值。TRUE。和 .错。不同之处: | VMS | Sun | IRIX | -----------|---

我不明白既然逻辑类型只有两种情况:
,那么为什么我们需要Fortran中的
逻辑(1)
逻辑(2)
逻辑(4)
逻辑(8)

我们只需要
1位

有人能解释一下吗

合乎逻辑


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

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

          |    VMS     |    Sun    |   IRIX    |    -----------|------------|-----------|-----------|-----------
.TRUE.    |    -1      |     1     |     1     |    -----------|------------|-----------|-----------|-----------
.FALSE.   |     0      |     0     |     0     |    -----------|------------|-----------|-----------|-----------
Unix机器自然地采用了C约定,VMS有一个 .TRUE的值很奇怪,但是仔细观察就会发现
如果是,错。为“所有位0”。为真。应为“所有位1”,以2的形式 补码有符号整数所有位设置为1的数字为-1

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

首先,Fortran并没有说我们的逻辑类型每个占用1、2、4和8个字节,它们肯定不是
逻辑(1)
逻辑(2)
逻辑(4)
,和
逻辑(8)
。一个实现可能会选择提供这些,称它们为那些名字

一个逻辑变量实际上只能有两个值。根据标准4.3.2.2(F90,尽管F2008在不同的地方表示相同):

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

处理器必须为逻辑类型的数据提供一种或多种表示方法。每个这样的方法都有一个类型参数的值,称为kind类型参数

[此处强调,稍后逐字强调。]

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

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

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


至于为什么多重表示可能有用,这归结为提供了一种选择,可能是针对特殊情况,例如阵列和理想内存管理(有些人喜欢玩不可移植的把戏)。但是,内存访问/对齐要求表明,标量逻辑将至少是一个字节(或填充使其相同)。对于C互操作性(F2003+),有一种
C_BOOL
对应于配套C处理器的
_BOOL
,它不需要相同的大小。

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