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

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

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

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

1010101 

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


person user2717225    schedule 26.08.2013    source источник


Ответы (4)


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

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

person aragaer    schedule 26.08.2013
comment
Я узнал, что «x» в «%x» относится к шестнадцатеричному формату, а не к целому. Это так? - person Rohit Kiran; 21.01.2015
comment
x относится к целому числу в шестнадцатеричном формате, в отличие от d, которое является целым числом в десятичном формате. Оба принимают int в качестве значения для печати. lx и ld принимают long. - person aragaer; 22.01.2015
comment
Для полноты также прочитайте stackoverflow.com/questions/ 15108932/c-the-x-format-specifier и cplusplus.com/reference /cstdio/printf - person randmin; 23.03.2018
comment
Оба принимают int как значение для печати --> Хммм, "%x" для unsigned, а не int. Достаточно распространено, что int работает, даже если это не указано в C. - person chux - Reinstate Monica; 23.06.2021

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

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

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

person PulkitRajput    schedule 03.11.2017

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

person PP.    schedule 26.08.2013

Вы на самом деле получаете правильное значение.

Способ, которым ваш x86 (совместимый) процессор хранит такие данные, находится в порядке Little Endian, что означает, что MSB является последним в вашем выводе.

Итак, учитывая ваш вывод:

10101010

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

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

Надеюсь, что это проясняется!

person RJM    schedule 19.02.2016
comment
О нет, printf не печатает MSB справа, это было бы довольно запутанно. - person eckes; 17.05.2017
comment
Помимо того, что сказал Экес, нумерация битов внутри большинства процессоров на самом деле не имеет значения, потому что вы обычно имеете дело с байтом за раз. Порядок битов имеет значение только для сериализации. Endianness (большой или маленький) - это порядок байтов, а не порядок битов. - person Daniel Papasian; 06.08.2017