十六进制常量
Hexadecimal Constants
我想声明一个基于其十六进制表示的整数参数。有什么区别:
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
。)
对于上面的 a
和 b
,gfortran
似乎在编译期间给我一个整数溢出错误(有用地告诉我我可以用 -fno-range-check
忽略它) ,但不适用于 c。
我需要使其与 Fortran 2003 兼容,因为此代码可能会在其他地方使用不同的编译器进行编译。
第一个和第三个语句不是有效的 Fortran。 boz 文字常量只能出现在许多有限的上下文中 - int intrinsic 是这些上下文之一。
中间语句根据 boz-literal-constant 指定的位序列将命名常量的值设置为与处理器相关的值。该值取决于处理器,因为结果值中的最高有效位是 1。
详细说明,使用 Fortran 2008 规则(Fortran 2003 不同,正如 Vladimir 所指出的):
- boz 文字常量指定一个 32 位(或 on/.TRUE./whatever)位的序列。
- INTEGER(INT32) 指定一个 STORAGE_SIZE 为 32 位的整数,大概大于或等于该类型对象的 BIT_SIZE(存储位和 "value bits" 可能因对齐要求等原因而有所不同)。
- 如有必要,INT 内部函数会将位序列截断为相关的位大小。
- 如果该截断序列最左边的位为零,则 INT 内在函数的值由类似
SUM([b(i) * (i-1)**2, i = 1, SIZE(b)])
的内容给出,其中 b 是表示位序列的数组,最右边的位在b(1).
- 如果该截断序列的最右边位是 1,如示例中所示,则标准表示结果取决于处理器。这是为了适应在值的内部表示中使用最高有效位来表示符号的典型做法。使用非常常见的整数补码表示,您将得到 -1 的值。
在 Fortran 2003 下,位序列被解释为使用处理器上可用的最大整数表示的正数。结果值将超出 INTEGER(INT32) 对象的范围,使代码不符合规范。
我想声明一个基于其十六进制表示的整数参数。有什么区别:
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
。)
a
和 b
,gfortran
似乎在编译期间给我一个整数溢出错误(有用地告诉我我可以用 -fno-range-check
忽略它) ,但不适用于 c。
我需要使其与 Fortran 2003 兼容,因为此代码可能会在其他地方使用不同的编译器进行编译。
第一个和第三个语句不是有效的 Fortran。 boz 文字常量只能出现在许多有限的上下文中 - int intrinsic 是这些上下文之一。
中间语句根据 boz-literal-constant 指定的位序列将命名常量的值设置为与处理器相关的值。该值取决于处理器,因为结果值中的最高有效位是 1。
详细说明,使用 Fortran 2008 规则(Fortran 2003 不同,正如 Vladimir 所指出的):
- boz 文字常量指定一个 32 位(或 on/.TRUE./whatever)位的序列。
- INTEGER(INT32) 指定一个 STORAGE_SIZE 为 32 位的整数,大概大于或等于该类型对象的 BIT_SIZE(存储位和 "value bits" 可能因对齐要求等原因而有所不同)。
- 如有必要,INT 内部函数会将位序列截断为相关的位大小。
- 如果该截断序列最左边的位为零,则 INT 内在函数的值由类似
SUM([b(i) * (i-1)**2, i = 1, SIZE(b)])
的内容给出,其中 b 是表示位序列的数组,最右边的位在b(1). - 如果该截断序列的最右边位是 1,如示例中所示,则标准表示结果取决于处理器。这是为了适应在值的内部表示中使用最高有效位来表示符号的典型做法。使用非常常见的整数补码表示,您将得到 -1 的值。
- 如果该截断序列最左边的位为零,则 INT 内在函数的值由类似
在 Fortran 2003 下,位序列被解释为使用处理器上可用的最大整数表示的正数。结果值将超出 INTEGER(INT32) 对象的范围,使代码不符合规范。