Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 十六进制常数_Fortran_Fortran2003 - Fatal编程技术网

Fortran 十六进制常数

Fortran 十六进制常数,fortran,fortran2003,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似乎在编译过程

我想声明一个基于十六进制表示的整数参数。以下各项之间的区别是什么:

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

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


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

使用Fortran 2008规则进行详细说明(正如弗拉基米尔所指出的,Fortran 2003是不同的):

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

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

IIRC Fortran 2003和2008之间的规则有一些变化。您需要严格遵守2003吗?软件的编码标准规定Fortran 2003“该值取决于处理器,因为结果值中的最高有效位为1。”——对不起,我不理解这句话。你能用一个例子解释一下吗?试着理解一下。无论本地建筑如何,这种解释似乎都是大端的。但是你是说负编码可能依赖于处理器?我遇到的各种文档都不涉及假定的编码。因此,它依赖于处理器,因为它取决于处理器存储有符号整数的方式。现在有没有处理器不将有符号整数存储为2的补码?是的(考虑一下你可以用纸和笔创建一个一致的处理器),但它们可能与你无关。您想做什么(您的问题是关于差异,而不是如何实现目标)?我正在实施。其中一些常量以十六进制形式给出,我想直接使用它们来防止手动转换错误。我正在我的桌面上测试,我只有
gfortran
,而
int(Z'9D2C5680',type=int32)
给了我一个编译时错误。