串流运算符<<与按位取反不能正常工作

Irb*_*bis 3 c++ c++11

我想对存储在stringstream对象中的数据使用按位取反。以下代码可以正常工作:

std::uint8_t x = 0x01;
x = ~x;

std::stringstream buf;
buf << x;
std::string data = buf.str();
std::cout << std::hex << static_cast<int>(data[0]) << std::endl;
//result: fffffffe
Run Code Online (Sandbox Code Playgroud)

当我以这种方式使用按位求反时:

std::uint8_t x = 0x01;

std::stringstream buf;
buf << ~x;
std::string data = buf.str();
std::cout << std::hex << static_cast<int>(data[0]) << std::endl;
//result: 0x2d
Run Code Online (Sandbox Code Playgroud)

我得到了意外的结果。怎么解释呢?如何与运算符<<一起使用按位求反?

Tho*_*lik 6

的结果~x不是类型std::uint8_t。您可以使用

std::uint8_t x = 0x01;

std::stringstream buf;
buf << static_cast<std::uint8_t>(~x);
std::string data = buf.str();
std::cout << std::hex << static_cast<int>(data[0]) << std::endl;
//result: 0x2d
Run Code Online (Sandbox Code Playgroud)

的结果~x-2。因此data[0]-带有ASCII码的 字符45 = 0x2d。而是之后

x = ~x;
Run Code Online (Sandbox Code Playgroud)

x包含þ具有ASCII值的值254 = 0xfe