以下代码未按预期工作:
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
#include <cstdint>
int main()
{
std::stringstream ss;
ss << std::setfill('0') << std::hex << std::setw(2) << std::int8_t(-1);
std::cout << ss.str() << std::endl;
}
我想要的是将一个有符号的char转换为固定长度的十六进制表示形式。 输出始终为0。
转换为无符号int还会打印意外输出:
ss << std::setfill('0') << std::hex << std::setw(2) << (unsigned int)std::int8_t(-1);
这将打印ffffffff,这是正确的,但我告诉流将宽度设置为2。 有什么办法可以解决这个问题吗?
您需要首先强制转换为无符号字符,以获得0-255范围内的值:
ss << std::setfill('0') << std::hex << std::setw(2) << (int)std::uint8_t(-1);
然后将其强制转换为大于char
(此处为int
)的整数类型,以使其打印为数字而不是字符。
您必须将-1
强制转换为UINT8_T
以获得255
,强制转换为无符号int
将停留在255
,然后打印为FF
:
ss << std::setfill('0') << std::hex << std::setw(2) << (unsigned int)std::uint8_t(-1);
当您将其强制转换为int8_t
时,它将保持在-1
,强制转换为无符号int
将得到4294967295
,然后将其打印为ffffffff
。