Форматирование. Система счисления

   
На этом шаге мы рассмотрим способы задания системы счисления.

   
Следующая группа из трех флагов управляет основанием системы счисления, используемой при вводе-выводе целых чисел (таблица 1).
Флаги определяются в классе ios_base вместе с соответствующей маской.

Таблица 2. Флаги системы счисления

МаскаФлагОписание
basefieldoctЧтение/запись в восьмеричной системе
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 перечислены манипуляторы, упрощающие работу с флагами этой группы.

Таблица 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).

Таблица 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.

Таблица 4. Манипуляторы для идентификации системы счисления

МанипуляторОписание
showbaseВывод идентификатора системы счисления (установка флага ios::showbase)
noshowbaseЗапрет на вывод идентификатора системы счисления (сброс флага ios::showbase)

   
На следующем шаге мы рассмотрим формат вещественных чисел.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий