我想根据十六进制表示声明一个整数参数。有什么区别:
INTEGER(kind=int32), PARAMETER :: a = Z'FFFFFFFF'
INTEGER(kind=int32), PARAMETER :: b = int(Z'FFFFFFFF', kind=int32)
INTEGER(kind=int32), PARAMETER :: c = transfer(Z'FFFFFFFF', 1_int32)
(是的,我知道这只是-1
。)
gfortran
似乎在编译过程中给出了一个整数溢出错误(有用地告诉我,我可以忽略-fno-range-check
}对于上面的a
和b
,但是不是为了c。
我需要使它符合Fortran 2003标准,因为此代码可能在其他地方使用不同的编译器进行编译。
答案 0 :(得分:3)
第一个和第三个语句对Fortran无效。 boz文字常量只能出现在许多有限的上下文中 - int intrinsic是其中一个上下文。
中间语句根据boz-literal-constant指定的位序列将命名常量的值设置为与处理器相关的值。该值取决于处理器,因为结果值中的最高位是1。
使用Fortran 2008规则进行阐述(Fortran 2003与Vladimir指出的不同):
today=$(date '+%b %e')
while IFS= read username date; do
if [ "$today" = "$date" ]; then
userdir="/home/$username"
touch "$userdir"/'Happy Birthday!!!'
fi
done < birthdays.data
之类的值给出,其中b是表示位序列的数组,最右边的位在b中( 1)。在Fortran 2003下,使用处理器上可用的最大整数表示将位序列解释为正数。结果值将超出INTEGER(INT32)对象的范围,使代码不符合。