В C есть ли способ установить максимальную ширину для целочисленного вывода?

Я последовательно печатаю шестнадцатеричные числа, чтобы сделать код операции для ассемблера на C. У меня все идеально, за исключением случаев, когда смещение отрицательное. Теперь у меня есть только 3 пробела для смещения, и когда я говорю -11 (основание 10), я конвертирую это и получаю fffffff5 в качестве ответа. Я хочу ограничить это так, чтобы отображалось только ff5. Есть ли способ сделать это? При печати положительных чисел из-за ограничений число никогда не будет больше 7FF, поэтому у меня нет проблем. Но с отрицательными числами он всегда будет печатать 8 шестнадцатеричных чисел, и мне нужны только 3 правильные цифры, можно ли это сделать?


person narcolepticNarwhal    schedule 22.04.2015    source источник
comment
Но вы знаете, что 0xfffffff5 и 0xff5 — это разные значения?   -  person deviantfan    schedule 23.04.2015
comment
@deviantfan, нет, если они оба представляют -11 в 32-битном и 12-битном представлениях дополнения со знаком до двух.   -  person Carl Norum    schedule 23.04.2015
comment
@CarlNorum Да, и именно поэтому в коде C с 32-битными переменными потребуется особая обработка (при повторном чтении или что-то в этом роде). Вот почему я пишу это, почему-то я сомневаюсь, что ОП знает об этом, если единственной проблемой являются пробелы.   -  person deviantfan    schedule 23.04.2015
comment
Я предположил, что он имел в виду 3 шестнадцатеричных значения, доступных в его кодировке инструкций. То есть смещение представляет собой 12-битное относительное смещение.   -  person Carl Norum    schedule 23.04.2015
comment
Ты прав. Мне разрешено только 3 шестнадцатеричных значения в кодировке инструкций. Диапазон относительной адресации моего компьютера составляет от -2048 до 2047, и только 3 шестнадцатеричных значения представляют число.   -  person narcolepticNarwhal    schedule 23.04.2015


Ответы (2)


Вы можете просто обрезать перед печатью:

unsigned int x = -11;
printf("%03x\n", x & 0xfff);

Пример вывода:

$ ./example 
ff5
person Carl Norum    schedule 22.04.2015
comment
Эй, спасибо. Я действительно ценю, что он исправил это отлично. Есть ли веб-страница, с которой вы это взяли? Я искал способ усекать целые числа и нигде не мог найти! - person narcolepticNarwhal; 23.04.2015

Ограничение значений диапазоном от -0x800 до 0x7FF работает, как предложено @Carl Norum с x & 0xfff.

теоретически, printf() также должен управлять локалью, которая буквально может распечатать намного больше, но на практике это не проблема. Конечно код мог бы использовать.

char buf[4];
buf[0] = 0;
snprintf(buf, sizeof buf, "%03x", x & 0xFFF);
fputs(buf, stdout);

Но это немного о поясе и подтяжках.

person chux - Reinstate Monica    schedule 22.04.2015
comment
@Carl Norum Если вы имеете в виду этот надоедливый дополнительный 'F' - исправлено. - person chux - Reinstate Monica; 23.04.2015
comment
Ага - вот оно. Я думаю, что я пропустил то, что происходит в первую очередь. Теперь я понимаю. - person Carl Norum; 23.04.2015