From 53ae7d1845c73307830b7981eba2e5ed7a1a1390 Mon Sep 17 00:00:00 2001 From: CYFS <2805686936@qq.com> Date: Thu, 9 Jul 2026 13:11:56 +0800 Subject: [PATCH] klibc: fix tiny vsnprintf long long formatting --- src/klibc/rt_vsnprintf_tiny.c | 17 ++++++++++++++++- src/klibc/utest/TC_rt_sprintf.c | 6 ++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/klibc/rt_vsnprintf_tiny.c b/src/klibc/rt_vsnprintf_tiny.c index 36811048a99..9cba6ae8d04 100644 --- a/src/klibc/rt_vsnprintf_tiny.c +++ b/src/klibc/rt_vsnprintf_tiny.c @@ -107,7 +107,15 @@ static char *print_number(char *buf, num = (rt_uint16_t)-num; } break; +#ifdef RT_KLIBC_USING_VSNPRINTF_LONGLONG case 'L': + if (num > (~0ULL >> 1)) + { + sign = '-'; + num = 0ULL - num; + } + break; +#endif /* RT_KLIBC_USING_VSNPRINTF_LONGLONG */ case 'l': if ((long)num < 0) { @@ -552,7 +560,14 @@ int rt_vsnprintf(char *buf, size_t size, const char *fmt, va_list args) if (qualifier == 'L') { - num = va_arg(args, unsigned long long); + if (flags & SIGN) + { + num = (unsigned long long)va_arg(args, long long); + } + else + { + num = va_arg(args, unsigned long long); + } } else if (qualifier == 'l') { diff --git a/src/klibc/utest/TC_rt_sprintf.c b/src/klibc/utest/TC_rt_sprintf.c index d8bba42c08c..8cbd369a21f 100644 --- a/src/klibc/utest/TC_rt_sprintf.c +++ b/src/klibc/utest/TC_rt_sprintf.c @@ -897,10 +897,12 @@ SPRINTF_TEST_CASE(integer_types) SPRINTF_CHECK("2147483647", buffer, "%li", 2147483647L); #ifdef RT_KLIBC_USING_VSNPRINTF_LONGLONG SPRINTF_CHECK("30", buffer, "%lli", 30LL); -#ifdef RT_KLIBC_USING_VSNPRINTF_STANDARD SPRINTF_CHECK("-9223372036854775807", buffer, "%lli", -9223372036854775807LL); SPRINTF_CHECK("9223372036854775807", buffer, "%lli", 9223372036854775807LL); -#endif /* RT_KLIBC_USING_VSNPRINTF_STANDARD */ + SPRINTF_CHECK("-2147483648", buffer, "%lld", (long long)(rt_int64_t)-2147483648LL); + SPRINTF_CHECK("4294967295", buffer, "%lld", (long long)(rt_int64_t)RT_UINT32_MAX); + SPRINTF_CHECK("-9223372036854775808", buffer, "%lld", (long long)(-9223372036854775807LL - 1LL)); + SPRINTF_CHECK("9223372036854775807", buffer, "%lld", 9223372036854775807LL); #endif /* RT_KLIBC_USING_VSNPRINTF_LONGLONG */ SPRINTF_CHECK("100000", buffer, "%lu", 100000L); SPRINTF_CHECK("4294967295", buffer, "%lu", 0xFFFFFFFFL);