首先,上下文:我正在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)
答案 0 :(得分:4)
您的代码中有两个问题:
您不知道在目标平台上用于定义uint64_t
文字的后缀。
您不知道要在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
粘贴在字面量之后。