1

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

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

我得到这个回应:

0000000000000000lx

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

00000000FFFFFFFF

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

作为参考,这是最新版本的 Silicon Labs 的 Simplicity Studio IDE 附带的 arm-none-eabi-gcc 编译器 (v4.7.3)。

4

1 回答 1

1

你试过这个吗?

#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-embedded的 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)
于 2014-10-02T17:50:29.107 回答