Вывод шестнадцатеричного значения printf казался больше, чем должно

У меня есть функция, которая рассчитывает 32-битный CRC,

У меня есть внутренняя переменная для класса, который содержит CRC.

функция, которая проверяет согласованность CRC, возвращает логический результат класса CRC с тем, что вычисляет класс,

функция-член внутри класса делает следующее,

сохраните CRC во временной переменной, вычислите CRC, затем сравните два значения.

bool X::CRCisMatching()
{
unsigned long tmpCRC = ClassCRC;
ClassCRC = GetNewCalculatedCRC();
printf("comparing %08x ~ with ~ %08x!\n", tmpCRC, ClassCRC);
return tmpCRC == ClassCRC;
}

проблема в том, что я получаю этот вывод,

comparing AB44CD2A33 ~ with ~ AB44CD2A33

почему я получаю 10 значений вместо 8, как и предполагалось с% 08x

кто-нибудь сталкивался с подобной проблемой раньше?

Кстати, я использую 32-битную машину

0

Решение

Так как %08x означает минимальный длина 8, не максимальная. И то, является ли ваша машина 32-битной или 64-битной, не обязательно контролирует размер long, Я предлагаю вам распечатать sizeof(unsigned long) подтвердить его размер.

Обычно (хотя и не гарантировано) 32-битные системы будут иметь 32-битные unsigned int, C предоставляет типы определенной ширины, такие как uint32_t и это также доступно в C ++ 11 через cstdint заголовок. (при условии, что есть базовый тип, который обеспечивает это).

Мой совет будет использовать этот тип, если ваш компилятор достаточно современный, в противном случае, если вы обнаружите, sizeof(unsigned int) == 4 (и ваши байты восемь битов), это тип, который вы, вероятно, должны использовать.

0

Другие решения

sizeof (int) не так, как ожидалось а также printf() (или пост) не так.

printf("comparing %08x ~ with ~ %08x!\n", tmpCRC, ClassCRC);

ОП сообщает об этом напечатанном «сравнении AB44CD2A33 ~ с ~ AB44CD2A33». Это означает, что спецификатор формата «% 08x», который ищет int, нашел int со значением, которое требуется более 4 байтов для представления. Это намекает на то, что int 8 байт. Сообщаемая 32-битная машина предлагает, но не указывает int ширина. Кроме того, 8 в %08x указывает только минимальный ширина печати.

ОП прошел unsigned long и спецификатор печати ожидал unsigned, Я подозреваю, что это не повлияло на проблему, если предположить, что эти два типа одинаковы на машине OP. Хороший код использовал бы спецификатор printf %08lx чтобы соответствовать unsigned long,

ОП сообщил о выходе «AB44CD2A33». С %x спецификатор формата, выход «ab44cd2a33» ожидается. Хотя это может быть просто ошибкой транскрипции, это вызывает опасения, что сообщение ошибочно в других местах или что компилятор не соответствует.

Если OP хочет использовать определенное 32-битное значение для 32-битной CRC, рекомендуем использовать тип uint32_t и PRIX32 для печати.

#include <inttypes.h>
uint32_t tmpCRC = ClassCRC;
printf("0x%" PRIX32 "\n", tmpCRC);
0