我一直在使用stringstream来转换我的数据,除了一个案例外,它一直很好用。
我正在减去两个可能最终为负或正的整数值。我接受该值并使用stringstream
将其发送到std::hex
对象,并将其转储到std::cout
。
我的问题是我的字段,这个值只能是3位数,当我得到一个负值时,它会用太多的前导F填充它。我似乎无法获得任何标准功能(setw
,setfill
,...)。
有人能指出我正确的方向吗?
示例:
Value - Value = -9, So what I want is FF9 but what I get is FFFFFFF9.
我的代码将值发送到我的stringstream对象ss
ss << hex << value - LocationCounter;
答案 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;