Литмир - Электронная Библиотека
A
A

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
, возвращая поток в состояние по умолчанию, в котором любое число выводится без указания его базы счисления.

Итак, существует несколько манипуляторов вывода.

Программирование. Принципы и практика использования C++ Исправленное издание - _085.png

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) // фиксированный и научный

 // формат

 // сбрасывает все флаги формата с плавающей точкой

155
{"b":"847443","o":1}