gpt4 book ai didi

fortran - 十六进制常量

转载 作者:行者123 更新时间:2023-12-04 02:01:04 26 4
gpt4 key购买 nike

我想声明一个基于其十六进制表示的整数参数。之间有什么区别:

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 兼容,因为此代码可能会在其他地方使用不同的编译器进行编译。

最佳答案

第一个和第三个语句不是有效的 Fortran。 boz 文字常量只能出现在许多有限的上下文中 - int 内在是这些上下文之一。

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

详细说明,使用 Fortran 2008 规则(Fortran 2003 不同,正如 Vladimir 指出的那样):

  • boz 文字常量指定一个 32 位(或 on/.TRUE./whatever)位的序列。
  • INTEGER(INT32) 指定一个 STORAGE_SIZE 为 32 位的整数,大概大于或等于该类型对象的 BIT_SIZE(由于对齐要求等原因,存储位和“值位”可能不同) ).
  • 如有必要,INT 内部函数会将位序列截断为相关的位大小。
    • 如果该截断序列最左边的位为零,则 INT 内在函数的值由类似 SUM([b(i) * (i-1)**2, i = 1 , SIZE(b)]) 其中 b 是表示位序列的数组,最右边的位在 b(1) 中。
    • 如果该截断序列的最右边位是 1,如示例中所示,则标准表示结果取决于处理器。这是为了适应在值的内部表示中使用最高有效位来表示符号的典型做法。使用非常常见的整数补码表示,您将得到 -1 的值。

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

关于fortran - 十六进制常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47192266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com