对于 Fortran PGI 编译器,为什么 real(.true.) 等于“-1.0”而 int(.true.) 等于“-1”?
With fortran PGI compiler, why is real(.true.) equal to "-1.0" and int(.true.) equal to "-1"?
我刚刚发现了这个可爱的事实。显然 Visual Basic
也是如此……也许答案是相似的?也许它也适用于其他语言?
编辑
显然这只适用于某些编译器——在我的例子中,使用 pgf90
PGI 编译器。它不适用于 gfortran
.
这 (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
就更复杂了。我不知道你是怎么得到结果的。
我刚刚发现了这个可爱的事实。显然 Visual Basic
也是如此……也许答案是相似的?也许它也适用于其他语言?
编辑
显然这只适用于某些编译器——在我的例子中,使用 pgf90
PGI 编译器。它不适用于 gfortran
.
这 (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
就更复杂了。我不知道你是怎么得到结果的。