2016-11-15 18 views
0

Я использую stringstream для преобразования моих данных, и он отлично работает, за исключением одного случая.Форматирование вывода подписанных шестнадцатеричных цифр

Я вычитаю два целочисленных значения, которые могут оказаться отрицательными или положительными. Я принимаю это значение и отправляю его на свой объект stringstream с использованием std::hex, а также его сбрасывают до std::cout.

Моя проблема в том, что мое поле для этого значения может быть только 3 цифры в длину, и когда я получаю отрицательное значение, он накладывает его на слишком много ведущих F. Кажется, я не могу получить какие-либо функции std (setw, setfill, ...).

Может ли кто-нибудь указать мне правильное направление?

Пример:

Value - Value = -9, So what I want is FF9 but what I get is FFFFFFF9. 

Мой код, чтобы отправить значение моего stringstream объекта сс

ss << hex << value - LocationCounter; 
+0

Какие вовлеченные типы фактически? 'unsigned int', указатели? –

+0

Вы знакомы с расширением знака? – user4581301

+2

С одной стороны, '-9' является' FF..FF7', а не 'FF..FF9' –

ответ

1

Вы пытаетесь вывести значение, 12 бит макс размера. Нет 12-битного типа данных, поэтому наиболее близким вы можете использовать 16-разрядный тип подписки с высокими 4 битами, установленными в 0. Например, сначала вычислите требуемое значение в 8-разрядный тип подписки (который позволит снизить его эффективную дальность до -128 .. 127), а затем подписать-распространить его на 16-битовый тип, ноль высоких 4 бита, и, наконец, выводить результат, как Hex:

signed char diff = (signed char)(value - LocationCounter); 
// the setw() and setfill() are used to pad 
// values that are 8 bits or fewer in size... 
ss << hex << setw(3) << setfill('0') << (((signed short)diff) & 0x0fff); 

для считывания значения обратно, чтение 12-разрядное шестнадцатеричное в signed short, а затем обрезает его значение в signed char:

signed short tmp; 
ss >> hex >> tmp; 
signed char diff = (signed char)tmp;