Вывести отрицательный шестнадцатеричный код с 6 символами на C

#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)));