格式化带符号十六进制数字的输出

时间:2016-11-15 19:42:55

标签: c++ std cout stringstream

我一直在使用stringstream来转换我的数据,除了一个案例外,它一直很好用。

我正在减去两个可能最终为负或正的整数值。我接受该值并使用stringstream将其发送到std::hex对象,并将其转储到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;

1 个答案:

答案 0 :(得分: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;