提问者:小点点

使用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;
}

我想要的是将一个有符号的char转换为固定长度的十六进制表示形式。 输出始终为0。

转换为无符号int还会打印意外输出:

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

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


共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