Не работает такой простейший вывод:
#include <iostream>
#include <iomanip>
int main()
{
int x(84568);
std::cout << std::setiosflags( std::ios_base::hex | std::ios_base::showbase | std::ios_base::uppercase) << x << std::endl;
std::cout << x << std::endl;
return 0;
}
Вывод таков:
84568
84568
С чем это может быть связано? Спасибо.
"Не работает" в данном случае именно std::ios_base::hex
.
Функция setiosflags
выставляет флаги по логике побитового ИЛИ. std::ios_base::hex
- это не просто один флаг, который можно просто взять и выставить. Форматам dec
, hex
и oct
по понятным причинам соответствует целое битовое поле, состоящее из нескольких битов. Выставлять значение этого поля по логике ИЛИ (как это делает setiosflags
) будет неправильно. Единичные биты для hex
, разумеется, выставятся, но уже уже присутствовавшие в этом поле единичные биты, скажем, для dec
при этом не сбросятся. В результате произойдет "перемешивание" битов dec
и битов hex
с непредсказуемым результатом. В вашем случае формат просто остался dec
.
Для того, чтобы перейти в формат hex
через setiosflags
надо сначала обнулить быты, ответственные за выбор системы счисления, а уж затем можно будет применять побитовое ИЛИ для выставления нового значения флагов через setiosflags
. Например
std::cout <<
std::resetiosflags(std::ios_base::basefield) <<
std::setiosflags(std::ios_base::hex) <<
x << std::endl;
Когда вы пользуетесь манипулятором std::hex
он все делает за вас сам - чистит старые флаги и выставляет новые. А если вы хотите пользоваться setiosflags
- то чистка флагов становится вашей ответственностью.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Добрый день! Наблюдаю странное падение программы на 20-30 раз запуска, а иногда может и совсем не упастьПодцепив отладчик вчера сидел целый...
Имеется массив char с 14k русских словНеобходимо отсортировать этот массив по алфавиту
Доброго времени суток! Нужно было написать почтовый клиент на сокетах, использующего протокол POP3 для чтения сообщенийНемного погуглив, наклакал...