Ответ 1
%02x
означает печать не менее 2 цифр, добавьте его 0
, если оно меньше. В вашем случае это 7 цифр, поэтому вы не получите дополнительных 0
впереди.
Кроме того, %x
для int, но у вас длинный. Вместо этого попробуйте %08lx
.
У меня есть простая программа:
#include <stdio.h>
int main()
{
long i = 16843009;
printf ("%02x \n" ,i);
}
Я использую спецификатор формата %02x
для получения 2 char вывода,
Однако вывод, который я получаю, это:
1010101
пока я ожидаю, что это будет: 01010101
.
%02x
означает печать не менее 2 цифр, добавьте его 0
, если оно меньше. В вашем случае это 7 цифр, поэтому вы не получите дополнительных 0
впереди.
Кроме того, %x
для int, но у вас длинный. Вместо этого попробуйте %08lx
.
%x
- это спецификатор формата, который форматирует и выводит шестнадцатеричное значение. Если вы предоставляете int или long значение, оно преобразует его в шестнадцатеричное значение.
%02x
означает, что если при условии, значение меньше, чем две цифры, то 0
будет предварять.
Вы 16843009
значение 16843009
и оно было преобразовано в 1010101
что является шестнадцатеричным значением.
Ваша строка шире, чем ширина вашего формата 2. Таким образом, отступы не выполняются.
Фактически вы получаете правильное значение.
То, как ваш x86
(совместимый) процессор хранит данные вроде этого, находится в Маленьком Endian порядке, что означает, что MSB последний в вашем выходе.
Итак, учитывая ваш результат:
10101010
последние два шестнадцатеричных значения 10
являются наиболее значимым байтом (2 hex digits = 1 byte = 8 bits
(для (возможно, ненужного) пояснения).
Итак, с помощью реверсирования порядка хранения памяти байтов ваше значение действительно: 01010101
.
Надеюсь, что это очистит!