在32位处理器(ARM Cortex A9)中使用64位数据时出现问题

时间:2019-06-16 16:29:16

标签: c arm

首先,上下文:我正在ARM Cortex A9处理器中实现一个程序。我有一个与C代码本身有关的问题,已在此处解决:How to set the values of an array to a single variable

首先,我在计算机(OS Linux 64位)中编写了代码,上面链接中的接受答案有效。但是,当我在ARM A9中执行相同操作时,它没有。我在ARM上做了一个简单的测试:

uint64_t test = 0x1B26B354A1CF;
printf("%lx", test);

它打印:

  

d

在我的计算机上也是如此:

 uint64_t test = 0x1B26B354A1CF;
 printf("%lx \n", test);

打印:

  

1b26b354a1cf

因此,这似乎是一个溢出问题或一个处理“大”数据的问题。如何找到解决方法或替代解决方案?

目标:ARTY Z7 FPGA(在这个问题上,您可以忽略“ FPGA”部分。我只是在使用该板具有的处理器:ARM A9 CORTEX)

3 个答案:

答案 0 :(得分:4)

您的代码中有两个问题:

  1. 您不知道在目标平台上用于定义uint64_t文字的后缀。

  2. 您不知道要在printf中为目标平台上的uint64_t值使用哪种格式说明符。

两者均可通过using macros defined in stdint.h解决。

尤其是要定义文字并将其分配给变量:

uint64_t test = UINT64_C(0x1B26B354A1CF);

要在printf中打印变量的十六进制值:

printf("%" PRIx64 "\n", test);

这保证可以在任何正确支持uint64_t的平台上运行,无论其处理器有多少位。

在大多数情况下,尽管语言本身不需要您为整数文字使用后缀-一个显着的例外是直接将文字用作变量变量printf的参数-明确地这样做通常是一种好的做法,并且在安全关键项目的代码准则中可能是强制性的。例如,MISRA C:2004准则的10.6规则要求对所有无符号常量使用U后缀。

答案 1 :(得分:1)

对于普通printf (and family),以十六进制打印<div class="row"> <div class="well"> <div class="col-md-1 Acomp"> <button class="btn setHeightToA">If this on is higher Make this one equal </button> </div> <div class="col-md-10 Acomp" style="background-color: gray; color: white;"> <p>most of the time this one height if higher no need to adjust </p> </div> </div> </div> <button class="btn addHeightB">Add 30px height to B</button> <button class="btn subtractHeightB">Subtract 30px height from B</button>unsigned long long最有可能)的格式为uint64_t。请注意额外的"%llx"大小前缀。

格式说明符和参数类型不匹配会导致不确定的行为

最可能发生的情况是,l在32位系统上为32位,在家庭系统上为64位,这就是为什么它在您的家庭系统上可以工作的原因。

答案 2 :(得分:0)

关于用于定义无符号64位文字的后缀,您可以检查stdint.h#define UINT64_MAX中使用了什么后缀。在我的情况下,如果我的字长为64,则使用一个名为__UINT64_C(c)的宏在文字后粘贴UL,如果我的字长为32,则将ULL粘贴在字面量之后。