2016-11-15 34 views
0

我一直在使用stringstream來轉換我的數據,除了一種情況以外,它一直在工作得很好。格式化輸出一個帶符號的十六進制數字

我減去兩個整數值,最終可能是負值或正值。我拿這個值,並使用std::hex發送給我的stringstream對象,並將其轉儲到std::cout

我的問題是我的字段這個值只能是3位數字,當我得到一個負值時,它填充了太多的前導F。我似乎無法獲得任何標準功能來幫助(setwsetfill,...)。

任何人都可以指向正確的方向嗎?

例子:

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

我的代碼將值發送到我的stringstream對象SS

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位,最後將結果輸出爲十六進制:

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; 
相關問題