当我尝试使用“%llu”而不是32位嵌入式平台上的数字打印u64变量时,为什么会出现“%lu”?

时间:2015-10-30 14:43:54

标签: c embedded printf overflow

我有一个文件,我从中获取流媒体应用程序的时间戳。时间戳是大数字,因此我使用u64数据类型以避免溢出。使用strtok,我正确地从文件中找到了我需要的号码,然后使用atollstrtoll将字符串转换为long long

当我使用格式说明符"%llu"打印数字时,打印的内容为"%lu"。我还将atollstrtoll得到的值与预期值进行比较,它更小,我猜这表明发生了溢出。

如果数字适合u64变量,为什么会发生溢出?例如,该数字是946688831000。

我应该注意到,我还使用long long而不是u64,但仍然没有。虽然它在Linux上运行,但在嵌入式平台上却没有。

以下是一些示例代码:

u64 timestamp;

char *inputTS = "946688831000";

timestamp = (u64) atoll(inputTS);

printf("Timestamp : %llu\n", timestamp);

1 个答案:

答案 0 :(得分:1)

小型嵌入式系统的多个编译器(包括针对ARM的系统)具有标准库,不支持64位格式化。它减少了堆栈使用和代码大小。

如果您提供有关用于链接的编译器和完整命令的信息,您可能自己启用此小型库(例如,使用-lupec中的-fspecs = nano开关来自arm-none-eabi-gcc)