串流运算符<<与按位取反无法正常工作

时间:2019-05-06 12:05:47

标签: 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

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

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

我得到了意外的结果。怎么解释呢?如何与运算符<<?

一起使用按位求反

1 个答案:

答案 0 :(得分:5)

~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

~x的结果为-2。因此,data[0]是字符-,其ASCII码为45 = 0x2d。而是在

之后
x = ~x;

x包含值þ,其值为ASCII值254 = 0xfe