Skip to content

[Bug] rt_vsnprintf格式化long long数值错误 #11596

Description

@milo-9

RT-Thread Version

all

Hardware Type/Architectures

all

Develop Toolchain

Other

Describe the bug

rt_vsnprintf_tiny.c 中rt_vsnprintf函数格式化long long数值错误,主要原因是print_number中将 'l' 与 'L'合并处理了

        switch (qualifier)
        {
        case 'h':
            if ((rt_int16_t)num < 0)
            {
                sign = '-';
                num = (rt_uint16_t)-num;
            }
            break;
        case 'L':
        case 'l':
            if ((long)num < 0)
            {
                sign = '-';
                num = (unsigned long)-num;
            }
            break;

使用以下代码测出结果不同

rt_kprintf("rt_kprintf: INT32_MIN = %lld\n", (int64_t)INT32_MIN);
printf("printf: INT32_MIN = %lld\n", (int64_t)INT32_MIN);
rt_kprintf("rt_kprintf: UINT32_MAX = %lld\n", (int64_t)UINT32_MAX);
printf("printf: UINT32_MAX = %lld\n", (int64_t)UINT32_MAX);
rt_kprintf("rt_kprintf: INT64_MIN = %lld\n", (int64_t)INT64_MIN);
printf("printf: INT64_MIN = %lld\n", (int64_t)INT64_MIN);
rt_kprintf("rt_kprintf: INT64_MAX = %lld\n", (int64_t)INT64_MAX);
printf("printf: INT64_MAX = %lld\n", (int64_t)INT64_MAX);

测试结果

rt_kprintf: INT32_MIN = -2147483648
printf: INT32_MIN = -2147483648
rt_kprintf: UINT32_MAX = -1
printf: UINT32_MAX = 4294967295
rt_kprintf: INT64_MIN = 9223372036854775808
printf: INT64_MIN = -9223372036854775808
rt_kprintf: INT64_MAX = -1
printf: INT64_MAX = 9223372036854775807

Other additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions