GCC ARM C编译器不尊重%llx printf格式化代码的-std=c99



我正在尝试使用以下内容打印一些64位无符号整数:

uint64_t x = 0xFFFFFFFFFFFFFFFF;
printf("Value: %016llx n", x); 

我得到的回应是:

0000000000000000lx

如果我将格式化字符串更改为%016lx,我会收到使用错误类型的编译警告,并且它只打印低32位:

00000000FFFFFFFF

我的编译器选项中有-std=c99字符串,它应该强制执行ll选项,对吧?

作为参考,这是arm none-eabi-gcc编译器(v4.7.3),它与Silicon Labs的Simplicity Studio IDE的最新版本一起提供。

你试过这个吗?

#include <stdio.h>
#include <inttypes.h>
int
main(void)
{
    uint64_t n = 0x123456789;
    printf("n = %#" PRIx64 "n", n);
    return (0);
}

printf或scanf的实现取决于您正在使用的libc,可能不支持long-long。请通过打印PRIx64的值进行检查-我想在您的情况下,它将是"lx"而不是"llx"。

粘贴ARM工具链gcc-ARM嵌入式的inttype.h的一部分

/* 64-bit types */
#if __have_long64
#define __PRI64(x) __STRINGIFY(l##x)
#define __SCN64(x) __STRINGIFY(l##x)
#elif __have_longlong64
#define __PRI64(x) __STRINGIFY(ll##x)
#define __SCN64(x) __STRINGIFY(ll##x)
#else
#define __PRI64(x) __STRINGIFY(x)
#define __SCN64(x) __STRINGIFY(x)
#endif
...
#define PRIx64          __PRI64(x)
#define PRIX64          __PRI64(X)

最新更新