На этом шаге мы рассмотрим способы задания системы счисления.
Следующая группа из трех флагов управляет основанием системы счисления, используемой при вводе-выводе целых чисел (таблица 1). Флаги определяются в классе ios_base вместе с соответствующей маской.
Маска | Флаг | Описание |
---|---|---|
basefield | oct | Чтение/запись в восьмеричной системе |
dec | Чтение/запись в десятичной системе (используется по умолчанию) | |
hex | Чтение/запись в шестнадцатеричной системе | |
нет | Запись в шестнадцатеричной системе, чтение в зависимости от начальных символов целого числа |
Смена основания системы счисления отражается на дальнейшем вводе-выводе всех целых чисел до следующего изменения флагов. По умолчанию используется десятичный формат. Поддержка двоичной записи не предусмотрена, однако чтение и запись целых чисел в двоичном виде может осуществляться при помощи класса bitset. За дополнительной информацией обращайтесь к 350 шагу.
Флаги системы счисления также распространяются на ввод. Данные читаются в системе, определяемой установкой одного из флагов. Если флаги не установлены, то при чтении основание системы счисления определяется по префиксу: число, начинающееся с префикса 0х или 0X, интерпретируется как шестнадцатеричное. Префикс 0 является признаком восьмеричной записи. Во всех остальных случаях число считается десятичным.
Существуют два основных способа переключения флагов системы счисления.
std::cout.unsetf (std::ios::dec); std::cout.setf (std::ios::hex);
std::cout.setf (std::ios::hex, std::ios::basefield);
В таблице 2 перечислены манипуляторы, упрощающие работу с флагами этой группы.
Манипулятор | Описание |
---|---|
oct | Запись и чтение в восьмеричной системе |
dec | Запись и чтение в десятичной системе |
hex | Запись и чтение в шестнадцатеричной системе |
Например, следующий фрагмент выводит х и у в шестнадцатеричной системе, a z - в десятичной системе:
int х, у, z;
std::cout << std::ios::hex << x << std::endl;
std::cout << у << ' ' << std::ios::dec << z << std::endl;
Дополнительный флаг showbase выводит числа по стандартным правилам обозначения системы счисления числовых литералов в C/C++ (таблица 3).
Флаг | Описание |
---|---|
showbase | Если флаг установлен, при выводе указывается система счисления числовых литералов |
При установке флага ios::showbase восьмеричные числа выводятся с префиксом 0, а шестнадцатеричные числа - с префиксом 0x (или при установленном флаге ios::uppercase - 0X). Например, рассмотрим такой фрагмент:
std::cout << 127 << ' ' << 255 << std::endl; std::cout << std::hex << 127 << ' ' << 255 << std::endl; std::cout.setf(std::ios::showbase); std::cout << 127 << ' ' << 255 << std::endl; std::cout.setf(std::ios:uppercase); std::cout << 127 << ' ' << 255 << std::endl;
Этот фрагмент выводит следующий результат:
127 255 7f ff 0x7f 0xff 0X7F 0XFF
Для управления флагом ios::showbase также можно использовать манипуляторы, представленные в таблице 4.
Манипулятор | Описание |
---|---|
showbase | Вывод идентификатора системы счисления (установка флага ios::showbase) |
noshowbase | Запрет на вывод идентификатора системы счисления (сброс флага ios::showbase) |
На следующем шаге мы рассмотрим формат вещественных чисел.