首页 > 解决方案 > 将无符号整数转换为 BCD

问题描述

我有一个转换uint16_t为 BCD 的功能。

uint16_t uint162BCD(uint16_t value)
{
    uint16_t b_val = 0;

    unsigned int shift = 0;
    while (shift / 8 < sizeof(bcd))
    {
        b_val = static_cast<uint16_t>(b_val + ((value % 10) << shift));
        value = value / 10;
        shift = shift + 4;
    }
    return b_val;
}

我用以下值做了一个小单元测试

ASSERT_EQ(uint162BCD(0), (uint16_t) 0x0);
ASSERT_EQ(uint162BCD((uint16_t) 1), (uint16_t) 0x1);
ASSERT_EQ(uint162BCD((uint16_t) 12), (uint16_t) 0x12);
ASSERT_EQ(uint162BCD((uint16_t) 123), (uint16_t) 0x123);
ASSERT_EQ(uint162BCD((uint16_t) 56), (uint16_t) 0x56);

这些似乎按预期转换。但是,如果我这样做。

ASSERT_EQ(uint162BCD((uint16_t) 0056), (uint16_t) 0x56);

它不起作用。我希望与 0x56 具有相同的值。我究竟做错了什么?

标签: c++bcd

解决方案


ASSERT_EQ(uint162BCD((uint16_t) 0056), (uint16_t) 0x56);

在 C 或 C++ 中,以“0”开头的字面整数被解释为八进制数。“0056”就是我们人类用十根手指称呼的“46”。


推荐阅读