C printf格式符%lld打印字符"ld"。

3
我是使用gcc(-std=gnu99)开发嵌入式工具链(Myriota),遇到了printf的问题。
当我尝试运行以下代码:
long long int time = TimeGet();
printf("\nSeconds since epoch: %lld\r\n", time);

它打印出以下内容:
Seconds since epoch: ld

使用"%" PRId64打印的结果与"ld"相同。
有什么想法吗?如果您能指出正确的地方,我将不胜感激。 编辑:变量类型更正为long long int time

1
感谢您的评论,您指出类型不正确是正确的。它应该是一个长长的整数。我怀疑这可能是一个错误,但我需要进行一次检查以确保正确性。我会联系Myriota。 - bot1131357
3个回答

6

很可能是你的C库,特别是它的printf实现,不支持C99。

long long int类型和%lld格式是由1999年的ISO C标准(C99)引入的。使用gcc -std=c99使编译器尝试符合C99(或者对于后来的版本使用-std=cNN),但它不能让运行时库执行它没有实现的操作。你的编译器支持和运行时库支持之间存在不匹配。

在C90中,在格式字符串中使用%lld调用printf具有未定义的行为。

%ld 对于 long int 类型的参数有效吗?如果参数在 LONG_MINLONG_MAX 的范围内,转换并使用 %ld 可能是一个不错的解决方法。如果您需要打印小于 LONG_MIN 或大于 LONG_MAX 的值,则实现 long long int 到字符串的转换并不是非常困难。(在某些实现中,long intlong long int 都是 64 位,因此只需转换为 long int 并使用 %ld 即可。)


1

Myriota SDK使用不支持int64_t的newlib-nano。 我将不得不实现自己的函数来转换为char字符串,或者强制转换为uint32_t。


0
#include <stdio.h>

void int64_to_string(int64_t num, char* str) {
    if (num < 0) {
        *str++ = '-';
        num = -num;
    }

    char buffer[20]; // Maximum 19 digits in int64_t
    int i = 0;
    do {
        buffer[i++] = num % 10 + '0';
        num /= 10;
    } while (num != 0);

    while (i > 0) {
        *str++ = buffer[--i];
    }
    *str = '\0';
}

int64_t num = 1234567890123456789;
char str[20]; // Maximum 19 digits in int64_t
int64_to_string(num, str);
printf("%s\n", str); // Output: "1234567890123456789"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接