Оператор stringstream << не работает должным образом с побитовым отрицанием - PullRequest
3 голосов
/ 06 мая 2019

Я хотел бы использовать побитовое отрицание для данных, которые хранятся в объекте 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

Я получаю неожиданный результат.Как это объяснить?Как использовать побитовое отрицание с оператором <<? </p>

1 Ответ

5 голосов
/ 06 мая 2019

Результат ~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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...