Преобразование Unsigned Int в 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. Что я делаю не так?


person liv2hak    schedule 05.08.2019    source источник


Ответы (1)


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

Буквенные целые числа в C или C++, начинающиеся с «0», интерпретируются как восьмеричные числа. «0056» — это то, что мы, люди с десятью пальцами, называем «46».

person Sam Varshavchik    schedule 05.08.2019
comment
есть ли escape-последовательность, чтобы она не интерпретировалась как восьмеричная. Я имею в виду, что моя ситуация такова, что 0056 является допустимым числом (десятичным) - person liv2hak; 05.08.2019
comment
Предполагая, что существует какой-то способ выразить 0056 в виде десятичного числа, это абсолютно ничего не даст. Существует только одно число, называемое 56, и независимо от того, указываете ли вы 56 или 0056, конечный результат точно такой же: двухбайтовое значение, содержащее 0 в первом байте и 56 во втором байте (из-за uint16_t, который ставится впереди из него). Это то, что выдаст ваш компилятор C++. Независимо от того, указано ли в вашем коде 56 или 0056 в той или иной форме, скомпилированный код будет идентичен. - person Sam Varshavchik; 05.08.2019