2015-04-22 2 views
2

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

+0

Но вы знаете, что 0xfffffff5 и 0xff5 - разные значения? – deviantfan

+2

@deviantfan, если оба они представляют '-11' в 32-битных и 12-разрядных представлениях двух дополнений. –

+0

@CarlNorum Да, и поэтому в коде C с 32-битными варами потребуется специальное лечение (при чтении его снова или что-то еще). Вот почему я пишу это, так или иначе я сомневаюсь, что OP это осознает, если единственная проблема - это пробелы. – deviantfan

ответ

2

Вы можете просто усечение перед печатью:

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

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

$ ./example 
ff5 
+0

Эй, спасибо. Я очень ценю, что он исправил это отлично. Есть ли у вас веб-страница? Я искал способ усечения целых чисел и не мог найти его нигде! – bobHarding

+0

Нет, я только что написал. –

+0

Независимо от благодарности, в любом случае, действительно оцените его. – bobHarding

1

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

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

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

Но это немного belt and suspenders.

+0

Не будет ли печатать неправильные три байта? –

+1

@ Carl Norum Если вы имеете в виду, что надоедливый дополнительный '' F'' - исправлен. – chux

+0

Yup - все. Я думаю, что мне не хватало того, что происходило вначале. Теперь я понимаю. –

Смежные вопросы