我想根据其十六进制表示形式声明一个整数参数。两者有什么区别:
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
and b
,但不适用于 c。
我需要使其符合 Fortran 2003,因为此代码可能会在其他地方使用不同的编译器进行编译。
第一个和第三个语句不是有效的 Fortran。 boz 文字常量只能出现在许多有限的上下文中 - int 内在函数就是这些上下文之一。
中间语句根据 boz-literal-constant 指定的位序列将命名常量的值设置为与处理器相关的值。该值取决于处理器,因为结果值中的最高有效位是 1。
使用 Fortran 2008 规则进行详细阐述(正如 Vladimir 指出的那样,Fortran 2003 是不同的):
- boz 文字常量指定 32 个 1(或 on/.TRUE./whatever)位的序列。
- INTEGER(INT32) 指定 STORAGE_SIZE 为 32 位的整数,该整数可能大于或等于该类型对象的 BIT_SIZE(由于对齐要求等原因,存储位和“值位”可能不同)。
- If necessary, the INT intrinsic truncates the bit sequence to the relevant bit size.
- 如果该截断序列的最左边位为零,则 INT 内在函数的值由以下公式给出
SUM([b(i) * (i-1)**2, i = 1, SIZE(b)])
其中b是表示位序列的数组,最右边的位在b(1)中。
- 如果该截断序列的最右边的位是 1(如示例所示),则标准表示结果取决于处理器。这是为了适应使用值的内部表示中的最高有效位来表示符号的典型做法。使用非常常见的整数补码表示法,您将得到 -1 值。
在 Fortran 2003 下,使用处理器上可用的最大整数表示形式将位序列解释为正数。结果值将超出 INTEGER(INT32) 对象的范围,从而使代码不合格。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)