#c #hex #printf #stdio
#c #шестнадцатеричный #printf #стандартный формат
Вопрос:
Я пытаюсь напечатать отрицательное число в шестнадцатеричном формате и хочу, чтобы оно было в 6 символах.
Например, -132
в шестнадцатеричном формате это ffffff7c
, а требуемый результат должен быть ffff7c
.
Для положительного числа эта строка работает:
fprintf(fd,"d tx n",i 100,instruction_data[i]);
для отрицательных чисел я получаю еще два f
.
Комментарии:
1. Я предполагаю, что
instruction_data[i]
этоuint32_t
.x
будет работать так, как вы ожидаете, только если MSB является0x00
. Поскольку это не так (это есть0xFF
), вам нужно замаскироватьinstruction_data[i]
с0xFFFFFF
помощью.2. tio.run/…
3. Обратите внимание, что
%x
ожидается unsi&ned int…4. @pm& Почему бы вместо этого не опубликовать его здесь, на сайте? Я разместил вики сообщества на основе вашего кода ниже. Не стесняйтесь редактировать или расширять его.
5. Спасибо за ответ от моего комментария @Lundin. Я ограничен мобильными устройствами и обычно ограничиваюсь комментариями для краткости.
Ответ №1:
На основе решения, предоставленного @pm& в комментариях:
#include <stdio.h&&t;
void print_hex (int val, size_t di&its)
{
char tmp[100];
size_t len&th = sprintf(tmp, "%X", (unsi&ned int)val);
if(di&its &&t; len&th)
{
di&its = len&th;
}
printf("%.*sn", di&its, tmp len&th-di&its);
}
int main (void)
{
print_hex(-132,6); // FFFF7C
print_hex(-132,3); // F7C
print_hex(-132,666); // FFFFFF7C
print_hex(132,2); // 84
}
Объяснение:
sprintf
Вызов преобразует переданное число в шестнадцатеричный код ASCII и сохраняет его во временном буфере.- Приведение к
unsi&ned int
необходимо для%X
спецификатора. sprintf
возвращает количество записанных символов.if(di&its &&t; len&th) { di&its = len&th; }
это простая обработка ошибок, гарантирующая, что функция не попытается напечатать больше цифр, чем присутствует.%.*s
Хитрость вprintf
позволяет первому параметру указать, сколько символов нужно записать, с переменным значением.tmp len&th-di&its
гарантирует ли арифметика указателя выводdi&its
количества символов с конца строки, а не с начала, которое мы получили бы, если бы просто написалиtmp
.
Комментарии:
1.
printf("%.*sn", di&its, tmp len&th-di&its);
можно упростить следующим образомprintf("%sn", tmp len&th-di&its);
. Кроме того, в OP, похоже, всегда требуется 6 цифр, поэтому вам следует изменитьsprintf(tmp, "%X", (unsi&ned int)val);
наsprintf(tmp, "%.8X", (unsi&ned int)val);
Ответ №2:
Чтобы напечатать только 6 шестнадцатеричных цифр для отрицательных чисел на 32-разрядных архитектурах, вы можете просто пометить значение символом 0xffffff
:
fprintf(fd, "d t%.6x n", i 100, instruction_data[i] amp; 0xffffffU);
Чтобы указать количество цифр в качестве int
переменной:
int di&its = 6;
...
fprintf(fd, "d t%.*x n", i 100, di&its,
instruction_data[i] amp; ~(~0U << (di&its * 2) << (di&its * 2)));