cout << showbase << dec; // показывать базы
cout << 1234 << '\t' << hex << 1234 << '\t' << oct << 1234 << '\n';
В результате получим следующий вывод:
1234 4d2 2322
1234 0x4d2 02322
Итак, десятичные числа не имеют префиксов, восьмеричные числа имеют префикс 0, а шестнадцатеричные числа имеют префикс
0x
(или
0X
). Именно так обозначаются целочисленные литералы в языке С++. Рассмотрим пример.
cout << 1234 << '\t' << 0x4d2 << '\t' << 02322 << '\n';
В десятичном виде эти числа выглядели бы так:
1234 1234 1234
Как вы могли заметить, манипулятор
showbase
является персистентным, как и манипуляторы
oct
и
hex
. Манипулятор
noshowbase
отменяет действие манипулятора
showbase
, возвращая поток в состояние по умолчанию, в котором любое число выводится без указания его базы счисления.
Итак, существует несколько манипуляторов вывода.
11.2.2. Ввод целых чисел
По умолчанию оператор
>>
предполагает, что числа используются в десятичной системе счисления, но его можно заставить вводить целые числа как шестнадцатеричные или восьмеричные.
int a;
int b;
int c;
int d;
cin >> a >> hex >> b >> oct >> c >> d;
cout << a << '\t' << b << '\t' << c << '\t' << d << '\n';
Если набрать на клавиатуре числа
1234 4d2 2322 2322
то программа выведет их так:
1234 1234 1234 1234
Обратите внимание на то, что при вводе манипуляторы
oct
,
dec
и
hex
являются персистентными, как и при выводе.
ПОПРОБУЙТЕ
Завершите фрагмент кода, приведенный выше, и преобразуйте его в программу. Попробуйте ввести предлагаемые числа; затем введите числа
1234 1234 1234 1234
Объясните результат. Попробуйте ввести другие числа, чтобы увидеть, что произойдет.
Для того чтобы принять и правильно интерпретировать префиксы
0
и
0x
, можно использовать оператор
>>
. Для этого необходимо отменить установки, принятые по умолчанию. Рассмотрим пример.
cin.unsetf(ios::dec); // не считать десятичным
// (т.е. 0x может означать
// шестнадцатеричное число)
cin.unsetf(ios::oct); // не считать восьмеричным
// (т.е. 12 может означать двенадцать)
cin.unsetf(ios::hex); // не считать шестнадцатеричным
// (т.е. 12 может означать двенадцать)
Функция-член потока
unsetf()
сбрасывает флаг (или флаги), указанный как аргумент. Итак, если вы напишете
cin >>a >> b >> c >> d;
и введете
1234 0x4d2 02322 02322
то получите
1234 1234 1234 1234
11.2.3. Вывод чисел с плавающей точкой
Если вы непосредственно работаете с аппаратным обеспечением, то вам нужны шестнадцатеричные числа (и, возможно, восьмеричные). Аналогично, если вы проводите научные вычисления, то должны форматировать числа с плавающей точкой. Они обрабатываются манипуляторами потока
iostream
почти так же, как и целые числа. Рассмотрим пример.
cout << 1234.56789 << "\t\t(общий)\n" // \t\t — выравнивание столбцов
<< fixed << 1234.56789 << "\t(фиксированный)\n"
<< scientific << 1234.56789 << "\t(научный)\n";
В итоге получим следующие строки:
1234.57 (общий)
1234.567890 (фиксированный)
1.234568e+003 (научный)
Манипуляторы
fixed
и
scientific
используются для выбора форматов для представления чисел с плавающей точкой. Интересно, что в стандартной библиотеке нет манипулятора
general
, который устанавливал бы формат, принятый по умолчанию. Однако мы можем определить его сами, как это сделано в заголовочном файле
std_lib_facilities.h
. Для этого не требуются знания о внутреннем устройстве библиотеки ввода-вывода.
inline ios_base& general(ios_base& b) // фиксированный и научный
// формат
// сбрасывает все флаги формата с плавающей точкой