十六进制常量

时间:2017-11-09 01:01:36

标签: fortran fortran2003

我想根据十六进制表示声明一个整数参数。有什么区别:

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}对于上面的ab,但是不是为了c。

我需要使它符合Fortran 2003标准,因为此代码可能在其他地方使用不同的编译器进行编译。

1 个答案:

答案 0 :(得分:3)

第一个和第三个语句对Fortran无效。 boz文字常量只能出现在许多有限的上下文中 - int intrinsic是其中一个上下文。

中间语句根据boz-literal-constant指定的位序列将命名常量的值设置为与处理器相关的值。该值取决于处理器,因为结果值中的最高位是1。

使用Fortran 2008规则进行阐述(Fortran 2003与Vladimir指出的不同):

  • boz文字常量指定32个(或/ .TRUE。/无论如何)位的序列。
  • INTEGER(INT32)指定一个STORAGE_SIZE为32位的整数,该整数可能大于或等于该类型对象的BIT_SIZE(存储位和"值位"可能不同到期对齐像对齐要求)。
  • 如果需要,INT内部函数会将位序列截断为相关的位大小。
    • 如果截断序列的最左边的位为零,则INT内在的值由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)。
    • 如果该截断序列的最右位是1,如示例中所示,标准表示结果取决于处理器。这是为了适应使用值的内部表示中的最重要位来表示符号的典型实践。使用非常常见的两个整数的补码表示,您将获得-1的值。

在Fortran 2003下,使用处理器上可用的最大整数表示将位序列解释为正数。结果值将超出INTEGER(INT32)对象的范围,使代码不符合。