为什么我们需要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。因为第一位是零。