2016-11-15 9 views
0

私はデータを変換するためにstringstreamを使用しています。符号付き16進数の出力形式を設定する

私は負または正になる可能性のある2つの整数値を減算しています。私はその価値を受け取り、を使用してstringstreamオブジェクトに送信し、std::coutにダンプします。

私の問題は、この値のフィールドは3桁にしかなりません。負の値を取ると、先行するFが多すぎます。私は助けるためにどんな標準機能も得られないようだ(setwsetfill、...)。

誰でも正しい方向に向けることができますか?

例:あなたは出力にサイズが12ビットで最大値をしようとしている

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

関与の種類は、実際には何ですか? 'unsigned int'、ポインタ? –

+0

あなたは標識拡張に精通していますか? – user4581301

+2

一方、 '-9'は' FF..FF9'ではなく 'FF..FF7'です –

答えて

1

私にstringstreamオブジェクトSSに値を送信するために

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

私のコード。 12ビットのデータ型はありません。したがって、最も近いのは、上位4ビットが0に設定された16ビットの符号付きの型を使用することです。たとえば、まず8ビットの符号付きの型に必要な値を計算します。 -128 .. 127にその有効範囲を減少させる)、その後、16ビットの符号付き型に符号拡張、高4ビットをゼロに、そして最終的に出力ヘクスとして結果:

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

読み取り、バック値を読み出しますsigned charsigned short、その後切り捨てるその値に12ビットの六角:

signed short tmp; 
ss >> hex >> tmp; 
signed char diff = (signed char)tmp; 
関連する問題