gpt4 book ai didi

c++ - Fortran 64 位十六进制 BOZ

转载 作者:太空宇宙 更新时间:2023-11-04 06:24:37 27 4
gpt4 key购买 nike

在 C++ 中,这是被接受的:

uint64_t mask = 0x7FC0000FF80001FFLL;

但是在 fortran 中

integer(kind=8), parameter :: mask = Z'7FC0000FF80001FF'

不适用于 gfortan。我认为它们都是 64 位值?还是不是?

gfortran 提示:

arithmetic overflow from converting INTEGER(16) to INTEGER(8)



编辑:

所以,对于造成的困惑,我们深表歉意,这里有一些更广泛的问题描述。我将在 Fortran 中进行一些位移,并在 C++ 中提供一些示例代码。在示例 C++ 代码中,掩码定义如下:

typedef uint64_t mask;
static const mask dilate_2 = (mask)0x7FC0000FF80001FFLL ;
static const mask dilate_1 = (mask)0x01C0E070381C0E07LL ;
static const mask dilate_0 = (mask)0x9249249249249249LL ;

根据我对 C++ 的理解,我认为十六进制值是 64 位整数值(它们以 LL 结尾)。现在在 Fortran 中,我的第一个问题是,用

定义
integer(kind=8), parameter ...  

没有用,正如 Vladimir 所说,因为

integer(kind=8), ...

可能不是 64 位整数。
比起我测试了 Alexanders 的解决方案,它适用于第一个和第二个 (dilate_2, dilate_1) 常量。
Vladimirs 解决方案也适用于这两个。
现在对于 dilate_0 这些解决方案都不起作用。我想 Vladimirs 解决方案将转换 0x9249249249249249LL(实际上是什么一个比 INT64 允许的更大的整数)转换成 INT64
如果我这样做:

integer(INT64), parameter :: dilate_0 = int(Z'9249249249249249', &
kind=kind(dilate_0)

但这也不起作用,gfortran 给我一个错误:

Error: Arithmetic overflow converting INTEGER(16) to INTEGER(8) at (1).

所以我的实际问题是如何在 Fortran 中实现这个常量?

最佳答案

正如 Vladimir 在他的评论中发布的那样,integer(kind=8) 不可移植(并且不是 kind 16,正如编译器所提示的那样)。

作为补救措施,我建议使用内部模块 ISO_Fortran_env (Fortran 2003),它有很多 predefined constants对于使用的编译器。使用此模块中的 INT64 可以解决您的问题并生成可移植代码:

program test
use,intrinsic :: ISO_Fortran_env, only: INT64
integer(INT64), parameter :: mask = Z'7FC0000FF80001FF'

print *,mask
end program

关于c++ - Fortran 64 位十六进制 BOZ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28743118/

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