TRUE的数值等价是-1?

时间:2016-09-12 15:56:48

标签: visual-studio visual-studio-2012 fortran logical-operators intel-fortran

我在Visual Studio 2012中使用英特尔Fortran编译Fortran代码。 当我尝试使用逻辑运算符时,我注意到一个独立的逻辑表达式会产生预期的T或F.但是,如果我需要数字T或F(0或1),当逻辑结果为T时,我得到-1。

例如:

integer*4 a
a = 1
logicval = (node(5,L).gt.0)
numval =  1*(node(5,L).gt.0)
write(*,*) logicval, numval

会输出

  

T,-1

有没有办法可以重新定义分配给T& T的数值。 F'

2 个答案:

答案 0 :(得分:4)

正如其他人所说,英特尔Fortran对此非标准用法的默认设置是低位设置(奇数)的整数值为真,偶数值(低位清除)为假。常量.TRUE。位模式为-1。在进行转换时会变得更复杂,直到版本17,编译器在这方面还没有完全一致。请注意,如果使用-standard-semantics,则隐含-fpscomp逻辑。

请阅读https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/275071#comment-1548435以及版本17发行说明(https://software.intel.com/en-us/articles/intel-fortran-compiler-170-release-notes),了解有关如何处理数字逻辑转换的版本变更信息。

答案 1 :(得分:2)

是的,预计英特尔Fortran的TRUE确实为-1,因为所有位都设置为1。

此外,将整数用作逻辑(布尔)变量是完全不标准的。您应该将代码延长几行并始终进行适当的转换。 Fortran中不允许使用integer_var = 1*(node(5,L).gt.0),许多编译器将拒绝。如果您放弃1* gfortran将发出警告,但您的表单会导致错误。

您可以简单地以符合标准的方式转换逻辑和整数

   if (l) then
     x = 1
   else
     x = 0
   end if

您可以使用MERGE() intrisic或使用WHERE轻松地将Fortran逻辑数组转换为1和0的整数数组。

对于英特尔Fortran,英特尔Fortran的一个简单修复可能是-fpscomp logicals,它将LOGICAL类型的处理切换为将零非零视为真,并使.true.常量等于整数1。

仍然要小心,因为它不会使你的程序可移植,它只是在一个特定的编译器中解决一个可移植性问题。

您可以使用C互操作逻辑类将定义与英特尔C表示相匹配:

use iso_c_binding

logical(c_bool) :: variable

这些值将为+1和0,因为C99指示_Bool。如果您需要它们与int互操作,则必须进行一些简单的转换。 C_intc_bool不兼容。

根据英特尔编译器的版本,您可能需要使用-standard-semantics(或-fpscomp logicals)来表示正确的logical(c_bool)。我认为这是非常不幸。