Подтвердить что ты не робот

Спецификатор формата% 02x

У меня есть простая программа:

#include <stdio.h>
int main()
{
        long i = 16843009;
        printf ("%02x \n" ,i);
}

Я использую спецификатор формата %02x для получения 2 char вывода, Однако вывод, который я получаю, это:

1010101 

пока я ожидаю, что это будет: 01010101.

4b9b3361

Ответ 1

%02x означает печать не менее 2 цифр, добавьте его 0, если оно меньше. В вашем случае это 7 цифр, поэтому вы не получите дополнительных 0 впереди.

Кроме того, %x для int, но у вас длинный. Вместо этого попробуйте %08lx.

Ответ 2

%x - это спецификатор формата, который форматирует и выводит шестнадцатеричное значение. Если вы предоставляете int или long значение, оно преобразует его в шестнадцатеричное значение.

%02x означает, что если при условии, значение меньше, чем две цифры, то 0 будет предварять.

Вы 16843009 значение 16843009 и оно было преобразовано в 1010101 что является шестнадцатеричным значением.

Ответ 3

Ваша строка шире, чем ширина вашего формата 2. Таким образом, отступы не выполняются.

Ответ 4

Фактически вы получаете правильное значение.

То, как ваш x86 (совместимый) процессор хранит данные вроде этого, находится в Маленьком Endian порядке, что означает, что MSB последний в вашем выходе.

Итак, учитывая ваш результат:

10101010

последние два шестнадцатеричных значения 10 являются наиболее значимым байтом (2 hex digits = 1 byte = 8 bits (для (возможно, ненужного) пояснения).

Итак, с помощью реверсирования порядка хранения памяти байтов ваше значение действительно: 01010101.

Надеюсь, что это очистит!