使用 stringstream 格式化 signed char 或 unsigned char

Format signed char or unsigned char with stringstream

以下代码未按预期工作:

#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;
}

我想要的是将带符号的字符转换为固定长度的十六进制表示形式。输出始终为 0�.

转换为 unsigned int 也会打印意外输出:

ss << std::setfill('0') << std::hex << std::setw(2) << (unsigned int)std::int8_t(-1);

这将打印正确的 ffffffff,但我告诉流将宽度设置为 2。有什么办法可以解决这个问题吗?

您需要先转换为 unsigned char,以获得 0-255 范围内的值:

ss << std::setfill('0') << std::hex << std::setw(2) << (int)std::uint8_t(-1);

然后将其转换为任何大于 char 的整数类型(此处为 int),以使其打印为数字而不是字符。

您必须将 -1 转换为 uint8_t 以获得 255,转换为 unsigned int 将停留在 255,然后打印为ff:

ss << std::setfill('0') << std::hex << std::setw(2) << (unsigned int)std::uint8_t(-1);

当你将它转换为 int8_t 时,它将停留在 -1,转换为 unsigned int 将得到 4294967295,然后将打印为 ffffffff.