Fortran 等价语句

Fortran 等价语句,fortran,Fortran,代码: 输出为: program CheckEquivalence integer*8 intarray(4) real*8 realarray(4) equivalence(realarray,intarray) realarray(3) = 3 intarray(4) = 4 realarray(1) = 1.0 realarray(2) = 2.0 do i = 1,4 write(,) 'All real ', realarray(i) e

代码:

输出为:

program CheckEquivalence
  integer*8 intarray(4)
  real*8 realarray(4)

  equivalence(realarray,intarray)
  realarray(3) = 3
  intarray(4) = 4
  realarray(1) = 1.0
  realarray(2) = 2.0

  do i = 1,4
    write(,) 'All real ', realarray(i)
  enddo
  do i = 1,4
    write(,) 'All int ', intarray(i)
  enddo
  do i = 1,3
    write(,) 'Some real ', realarray(i)
  enddo
  write(,) 'Last int ', intarray(4)
end
我尝试了一个示例代码来理解等价性是如何工作的。 我的查询是存储内部数据的格式 还有我能从中得到理论上相同值的算法吗?

如下所述:

这两个值之间没有转换。它根据您写入变量的内容进行存储,并根据您访问变量的方式进行解释。因此,如果您向
REAL
写入一个实数,然后尝试打印整数变量,您将得到垃圾。反之亦然


一般来说,不要使用
等价性
语句。他们是个坏主意,不受欢迎。如果您正在编写新代码,不要将它们放在内存中——如果您试图解释旧代码,它们通常用于通过为不同目的重用同一位置在内存中创建紧凑存储

是的,正如已经回答的那样,使用等价性的理由非常少。几十年前,它被广泛用于通过重叠阵列来节省内存。它也可用于低级非便携式操作。如果存储实数并输出为整数,则结果将不可移植,超出语言标准,具体取决于所使用硬件的数字表示形式。执行位级操作有时会有一些原因,例如,如果您读入二进制数据,然后确定它是什么类型。或者进行字节交换。等价的现代替代品是“转移”内在功能

All real 1.
All real 2.
All real 3. 
All real 1.97626258E-323
All int 4607182418800017408 
All int 4611686018427387904
All int 4613937818241073152 
All int 4
Some real 1. 
Some real 2. 
Some real 3.
Last int 4