Я последовательно печатаю шестнадцатеричные числа, чтобы сделать код операции для ассемблера на C. У меня все идеально, за исключением случаев, когда смещение отрицательное. Теперь у меня есть только 3 пробела для смещения, и когда я говорю -11 (основание 10), я конвертирую это и получаю fffffff5
в качестве ответа. Я хочу ограничить это так, чтобы отображалось только ff5
. Есть ли способ сделать это? При печати положительных чисел из-за ограничений число никогда не будет больше 7FF
, поэтому у меня нет проблем. Но с отрицательными числами он всегда будет печатать 8 шестнадцатеричных чисел, и мне нужны только 3 правильные цифры, можно ли это сделать?
В C есть ли способ установить максимальную ширину для целочисленного вывода?
Ответы (2)
Вы можете просто обрезать перед печатью:
unsigned int x = -11;
printf("%03x\n", x & 0xfff);
Пример вывода:
$ ./example
ff5
person
Carl Norum
schedule
22.04.2015
Эй, спасибо. Я действительно ценю, что он исправил это отлично. Есть ли веб-страница, с которой вы это взяли? Я искал способ усекать целые числа и нигде не мог найти!
- 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
@Carl Norum Если вы имеете в виду этот надоедливый дополнительный
'F'
- исправлено.
- person chux - Reinstate Monica; 23.04.2015
Ага - вот оно. Я думаю, что я пропустил то, что происходит в первую очередь. Теперь я понимаю.
- person Carl Norum; 23.04.2015
-11
в 32-битном и 12-битном представлениях дополнения со знаком до двух. - person Carl Norum   schedule 23.04.2015