首页 > 解决方案 > 使用 fortran PGI 编译器,为什么 real(.true.) 等于“-1.0”而 int(.true.) 等于“-1”?

问题描述

我刚刚发现了这个可爱的事实。显然这也适用于Visual Basic......也许答案是相似的?也许它也适用于其他语言?

编辑

显然这只适用于某些编译器——在我的例子中,使用pgf90PGI 编译器。它不适用于gfortran.

标签: fortranfortran90

解决方案


这 ( int(.true.)==-1)不是真的。好吧,至少不是一般的。

首先,您不应int()使用合乎逻辑的参数进行调用。但是您的编译器可能允许它作为扩展。

> gfortran realinttrue.f90 
realinttrue.f90:1:13:

 print *,real(.true.), int(.true.)
             1
Error: ‘a’ argument of ‘real’ intrinsic at (1) must have a numeric type
realinttrue.f90:1:26:

 print *,real(.true.), int(.true.)
                          1
Error: ‘a’ argument of ‘int’ intrinsic at (1) must have a numeric type

也许您的意思是:

print *, transfer(.true.,1)
end

无论如何,唯一可以保证的是有两个不同的值,TRUE 和 FALSE。它们在内存中的样子取决于编译器。有两个明显的选择。将所有位设置为 1,将第一位设置为 1。第一个是-1的整数值,另一个是+1。

例如,上面的代码确实

> ifort trueint.f90 
> ./a.out 
          -1
> ifort trueint.f90 -standard-semantics
> ./a.out 
 1
> gfortran trueint.f90
> ./a.out 
           1

因为real它更复杂。我不知道你是如何得到你的结果的。


推荐阅读