Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
const a = 1;
static x;
все определяют объект типа int.
2.3. Данные типа char
Данные типа char занимают в памяти 1 байт. Код от 0 до 255 в этом байте задает один из 256 возможных символов. Закрепление конкретных символов за кодами задается так называемыми кодовыми таблицами. Для персональных компьютеров наиболее распространена ASCII-таблица.
Тип char является типом «целое». Данные типа char могут рассматриваться компилятором и как данные со знаком (signed char), и как данные без знака (unsigned char).
Если тип char рассматривается как signed, то старший бит его кода определяет знак. В случае unsigned char все восемь бит рассматриваются как код, а диапазон возможных значений от 0 до 255.
Константа типа char представляет собой символ заключенный в одиночные кавычки, например ‘A’, ‘$’. Внутренний код байта, соответствующего константе, определяется по кодовой таблице.
Представление группы символьных констант описаны ниже в параграфе 2.5.3.
Переменная типа char занимает 1 байт памяти и описывается с использованием ключевого слова char. При описании переменной ей можно задать начальное значение. Например:
char symbol=’\0100’; /* прописная латинская P */
char name=’0’, first=’\n’;
2.4. Данные с плавающей точкой
Язык Borland C++ поддерживает операции с плавающей точкой. Особенностью персональных компьютеров IBM PC является отсутствие в системе команд микропроцессора Intel, на базе которых они построены, операций над числами с плавающей точкой. Такие арифметические операции выполняет либо специальный сопроцессор математики с плавающей точкой (сопроцессоры 8087/80287/80387), либо при его отсутствии специальные стандартные подпрограммы (программная эмуляция сопроцессора).
Компилятор использует три формы внутреннего представления данных с плавающей точкой (табл.3).
Таблица 3
Данные с плавающей точкой для компилятора Borland C++ 3.1
Тип | Размер, бит | Диапазон представления чисел(abs) | Точность (десятичных цифр) | |
Максимум | минимум | |||
Float Double Long double | 32 64 80 | 3.4*10-38 1.7*10-308 3.4*10-4932 | 3.4*1038 1.7*10308 3.4*104932 | 7 15 19 |
Borland C++ поддерживает IEEE-стандарт, в соответствии с которым такие данные представляются в виде двух частей – мантиссы М и порядка Р числа в двоичной системе счисления:
С = М * 2Р
Число бит для хранения мантиссы и порядка зависит от типа данных с плавающей точкой (рис. 2).
float: | S | P | M |
|
31 | 30 23 | 22 0 |
| |
double: | S | P | M |
|
63 | 62 52 | 51 0 |
| |
long double: | S | P | M | |
79 | 78 64 | 63 0 | ||
S – знак числа (0 – для положительных, 1 – для отрицательных);
Р – сдвинутый порядок числа;
М – мантисса числа.
Рис. 2. IЕЕЕ-стандарт внутреннего представления данных с плавающей точкой.
Вещественное число в памяти хранится с нормализованной мантиссой. При нарушении нормализации мантиссу сдвигают влево до тех пор, пока старшей цифрой мантиссы не станет 1. Каждая операция сдвига сопровождается уменьшением порядка на 1. Но если мантисса всегда нормализована, то старшую единицу можно и не хранить в памяти. Это экономит один бит и, следовательно, увеличивает точность представления вещественных чисел. Эта единица присутствует неявно и называется неявной единицей (implicit one). Отбрасывание старшей цифры мантиссы выполняется для форматов float и double, но не выполняется для long double.
Порядок числа хранится "сдвинутым", т. е. к нему прибавляется число так, чтобы порядок был всегда неотрицательным. Для чисел формата float прибавляется 127, для чисел формата double - 1023, для чисел формата long double -16383. Всегда неотрицательный порядок избавляет от необходимости выделять один бит для хранения знака порядка и упрощает выполнение операций сравнения порядков и арифметических операций над ними.
Например, число 15.в двоичной системе счисления) в формате float IEEE-стандарта записывается так:
1.111011*211.
Учитывая отбрасывание неявной единицы и сдвиг порядка, получаем внутреннее представление числа:
S = 0;
Р = 3+127 = 130(1000.0010 в двоичной системе счисления);
М = 1110110...0.
Переменные с плавающей точкой описываются с использованием спецификаторов типа float, double, long double.
Причина того, что представляется более чем один целый тип, более чем один беззнаковый тип и более чем один тип с плавающей точкой в том, чтобы дать возможность программисту воспользоваться характерными особенностями аппаратного обеспечения. На многих машинах между различными разновидностями основных типов существуют значительные различия в потребностях в памяти, временах доступа к памяти и временах вычислений. Размеры типов не указаны в стандарте языка а зависят от операционной системы, компилятора и разрядности процессора. В компьютерах с 16-ти разрядными процессорами int – 2 байта, в компьютерах с 32-х разрядными процессорами – 4 байта и т. д. В стандарте языка С++ указаны следующие соотношения относительно размеров основных типов:
I = = sizeof (char) < = sizeof(short) < = sizeof(int) < = sizeof(long)
sizeof (float) < = sizeof(double)
Однако обычно разумно предполагать, что в char могут храниться целые числа в диапазоне 0…127, что short и int имеют не менее 16 битов, что int имеет, по меньшей мере, 24 бита.
Беззнаковые (unsigned) целые типы идеально подходят для применений, в которых память рассматривается как массив битов.
2.5. Константы
С++ дает возможность записи значений основных типов: символьных констант, целых констант и констант с плавающей точкой. Кроме того, нуль (0) может использоваться как константа любого указательного типа, и символьные строки являются константами типа char[]. Можно также задавать символические константы. Символическая константа - это имя, значение которого не может быть изменено в области его видимости. В С++ имеется три механизма определения символических констант: 1) любому значению любого типа можно дать имя и использовать его как константу, добавив к его описанию ключевое слово const; 2) множество целых констант может быть определено как перечисление; 3) любое имя массива или функции является константой.
2.5.1. Целые константы
Целые константы предстают в четырех "обличиях": десятичные, восьмеричные, шестнадцатиричные и символьные константы. Десятичные используются чаще всего и выглядят так:
0 14736
Десятичная константа имеет тип int, при условии, что она "влезает" в int, в противном случае ее тип – long суффикс L или l явно указывает компилятору, что тип константы – long, например 314564L или 3254354l. Компилятор должен предупреждать о константах, которые слишком длинны для представления в машине.
Константа, начинающаяся нулем, за которым идет x (0x), является шестнадцатеричным числом, а константа, начинающаяся нулем, за которым идет цифра, является восьмеричным числом. Например:
0564 / / восьмеричные константы
0x0 0x6 0x3f 0x56 / / шестнадцатеричные константы
2.5.2. Константы с плавающей точкой
Константы с плавающей точкой могут иметь тип float, double или long double. Как и в предыдущем случае, компилятор должен предупреждать о константах с плавающей точкой, которые слишком велики, чтобы их можно было представить.
Компилятор использует три формы внутреннего представления данных с плавающей точкой (табл.3).
Если вы хотите иметь константу с плавающей точкой типа float, вы можете определить ее как:
const float pi8 = 3.;
Признаком константы с плавающей точкой для компилятора является наличие в записи константы десятичной точки, символа е или Е. Например, 21е-5; -44.; 67.28Е4; .09е+18; .0; 0.; 0.0.
По умолчанию (при отсутствии суффиксов переопределения) константы с плавающей точкой имеют тип double. При наличии суффикса f (F) константа имеет тип float, l (L) – long double.
2.5.3. Символьные константы
Хотя в С++ и нет отдельного символьного типа данных, в нем для символов имеется специальная и удобная запись. Символьная константа - это символ, заключенный в одинарные кавычки; например, 'a' или '0'. Такие символьные константы в действительности являются символическими константами для целого значения символов в наборе символов машины. Употребление символьных констант вместо десятичной записи делает программу более переносимой. Несколько символов также имеют стандартные имена, в которых обратная косая \ используется как escape - символ. Некоторые из них:
'\b' возврат назад
'\f' перевод формата
'\n'' новая строка
'\r' возврат каретки
‘\t’ табуляция
Для явного указания кода символа используется выражение ‘\nnn’, где nnn - восьмеричный код или ‘\0xhh’, где hh – шестнадцатеричный код.
2.5.4. Строки
Строковая константа - это последовательность символов, заключенная в двойные кавычки:
"это строка"
Каждая строковая константа содержит на один символ больше, чем кажется; все они заканчиваются пустым символом '\0' со значением 0. Например:
sizeof ("wer") = = 5;
Строка имеет тип "вектор из соответствующего числа символов", поэтому "wer" имеет тип char[5]. Пустая строка записывается " " (и имеет тип char[1]).
В строке может стоять обратная косая, сразу после которой идет новая строка; и то, и другое будет проигнорировано:
cout << "здесь все \
ok"
напечатает:
здесь все ok
Новая строка, перед которой идет символ \ не приводит к появлению в строке новой строки, это просто договоренность записи.
В строке можно иметь пустой символ, но большинство программ не будет предполагать, что есть символы после него. Вставляя численную константу в строку с помощью восьмеричной или шестнадцатеричной записи благоразумно использовать число из трех цифр.
2.5.5. Const
Ключевое слово const может добавляться к описанию объекта, чтобы сделать этот объект константой, а не переменной:
const int model = 232;
const int w[] = {1,2,3,4};
Поскольку константе ничего нельзя присвоить, она должна быть инициализирована. Описание чего-нибудь как const гарантирует, что его значение не изменится в области видимости:
model = 145; / / ошибка
model++; / / ошибка
Const изменяет тип, т. е. ограничивает способ использования объекта, вместо того, чтобы задавать способ размещения константы.
2.5.6. Стандартные преобразования типов.
При вычислении выражений некоторые операции требуют, чтобы операнды имели соответствующий тип, а если требования к типу не выполнены, принудительно вызывают выполнение нужных преобразований. Та же ситуация возникает при инициализации, когда тип инициализирующего выражения приводится к типу определяемого объекта. Напомним, что в языках Си и Си++ присваивание является бинарной операцией, поэтому сказанное относительно преобразования типов относится и ко всем формам присваивания. Правила преобразования в языке Си++ для основных типов полностью совпадают с правилами преобразований, стандартизованными в языке Си:
операнды разных типов приводятся к "старшему", т. е. более длинному типу; ниже перечислены типы, начиная от самого старшего, в порядке убывания старшинства: самый старший - long double, double, float, unsigned long, long int, unsigned, int, char - самый младший;
при выполнении операции присваивания результат приводится к типу переменной слева от знака операции; в этом случае может возникнуть ситуация преобразования "старшего" типа к "младшему".
При преобразовании типов нужно различать преобразования, изменяющие внутреннее представление данных, и преобразования, изменяющие только интерпретацию внутреннего представления. Например, когда данные типа unsigned unt переводятся в тип int, менять их внутреннее представление не требуется - изменяется только интерпретация. При преобразовании типа float в тип int недостаточно изменить только интерпретацию, необходимо изменить длину участка памяти для внутреннего представления и кодировку. При таком преобразовании из float в int возможен выход за диапазон допустимых значений типа int, и реакция на эту ситуацию существенно от конкретной реализации. Именно поэтому для сохранения мобильности программ в них рекомендуется с осторожностью применять преобразование типов.
Рассмотрим этапы (последовательность выполнения) преобразования операндов в арифметических выражениях.
Все короткие целые типы преобразуются в типы неменьшей длины в соответствии с табл. 1. Затем оба значения, участвующие в операции, принимают тип float или int либо double в соответствии со следующими правилами.
Если один из операндов имеет тип long double, то второй тоже будет преобразован в long double.
Если п.2 не выполняется и один из операндов есть double, другой приводится к типу double.
Если п.2 - 3 не выполняются и один из операндов имеет тип float, то второй приводится к типу float.
Если п.2 - 4 не выполняются (оба операнда целые) и один операнд long int, а другой unsigned int, то, если long int может представить все значения unsigned int, последний преобразуется к long int; иначе оба операнда преобразуются к unsigned long int.
Если п.2 - 5 не выполняются и один операнд есть long, другой преобразуется к long.
Если п.2 - 6 не выполнены и один операнд unsigned, то другой преобразуется к unsigned.
Если п.2 - 7 не выполнены, то оба операнда принадлежат типу int.
Таблица 4
Правила стандартных арифметических преобразований
Исходный тип | Преобразуется в | Правила преобразования |
char | int, unsigned int, long int, unsigned long | Расширение нулем или знаком в зависимости от умолчания для char (см. пример 1) |
unsigned char | int | Старший байт заполняется нулем |
signed char | int | Расширение знаком |
short | int | Сохраняется то же значение |
unsigned short | unsigned int | Сохраняется то же значение |
int | unsigned int | Сохраняется то же значение |
int | long, unsigned long | Расширение знаком |
unsigned int | long unsigned | Добавление двух нулевых старших байтов |
long int | unsigned long | Сохраняется то же значение |
enum | int | Сохраняется то же значение |
битовое поле | int | Сохраняется то же значение |
Пример:
char ff = '\xff ', gg = '\x7f '; int i, j;
i = ff; //0xffff для signed char (размножение знака);
//0x00ff для unsigned char (размножение нуля)
j = gg; //0x007f для signed char (размножение знака);
//0x007f для unsigned char (размножение нуля)
Используя арифметические выражения, следует учитывать приведенные правила и не попадать в "ловушки" преобразования типов, так как некоторые из них приводят к потерям информации, а другие изменяют интерпретацию битового представления данных.
3. ЭЛЕМЕНТАРНЫЙ ВВОД-ВЫВОД
3.1. Форматированный ввод-вывод
Особенностью С++ является отсутствие специальных операторов ввода-вывода. Вместо этого используются библиотечные функции. Далее предельно кратко рассматриваются некоторые функции Borland С++ для ввода информации с клавиатуры и ее вывода на экран. Подробно ввод-вывод информации, в том числе и работа с дисками, рассматривается во второй книге комплекса.
Консольный ввод-вывод может быть двух видов: форматированный и неформатированный. Форматированный ввод-вывод даст возможность обрабатывать за одно обращение к библиотечной функции несколько элементов, выполняя, если необходимо, преобразование данных. Две функции-компаньона – scanf() и printf() выполняют соответственно консольный ввод и вывод. Этим функциям передастся переменное число аргументов, но первым аргументом всегда является текстовая (так называемая форматная) строка. Она задает способ преобразования данных. Функция printf() выдаст на экран всю форматную строку, в которой знак %ххх заменяется символами выводимой информации. Символы после % до первого разделителя рассматриваются как спецификация преобразования значения выводимой переменной. Имя переменной - это второй, третий и т. д. аргументы списка аргументов. Правила использования функции printf() представлены на рис. 3.
Функция scanf() принимает с консоли все символы до нажатия клавиши ENTER и помещает их в буфер. Затем по форматной строке определяется способ преобразования введенных символов в соответствии с заданными спецификациями. Полученное в результате преобразования число помещается по адресу переменной, который является вторым, третьим и т. д. аргументом в списке аргументов функции. Спецификация преобразования задается в виде последовательности
% [флаги ] [ширина ] [.точность J [F S N i h! 1 ]<тип>
В табл. 5 перечисляются некоторые из знаков, задающих спецификацию преобразования.

Рис. 3. Правила использования функции printf().
Таблица 5.
Символы управления форматированием
Элемент специфика-ции | Производимый эффект |
Флаги | |
- + Пробел # | Производится выравнивание влево выводимого числа в пределах выделенного поля. Правая сторона выделенного поля дополняется пробелами. По умолчанию устанавливается выравнивание вправо Выводится знак числа символом ‘-‘ или ‘+’ Выводится пробел перед числом, если оно положительно. Для отрицательных чисел знак ‘-‘ выводится всегда Выводится идентификатор системы счисления для целых: 0 перед числом, выводимым в восьмеричной с/с; 0х или 0Х для чисел, выводимых в шестнадцатеричной с/с; ничего для чисел, выводимых в десятичной с/с Выводится десятичная точка для чисел типа float |
Ширина | Воздействует только на вывод |
n 0n * | Определяет минимальную ширину поля в n символов. Если после преобразования ширины недостаточно, выводится столько символов, сколько есть. Незаполненные позиции дополняются пробелами Все то же самое, но позиции слева для целого числа дополняются нулями Следующий аргумент из списка аргументов задает ширину |
Точность | Воздействует только на вывод |
Ничего .0 .n * | Точность по умолчанию Для d, i, o, u, x точность по умолчанию. Для e, E, f десятичная точка отсутствует Для e, E, f не более n знаков после точки Следующий аргумент из списка аргументов - точность |
Модификатор | Воздействует там, где применимо |
h l | Для d, i, o, u, x, X аргумент является short int Для d, i, o, u, x, X аргумент является long int Для e, E, f, g, G аргумент является double (только для scanf) |
Тип преобра-зования | |
c d i o u x X f e E g G s | ТИП ПЕРЕМЕННОЙ: CHAR При вводе – из файла читается и передается переменной один байт. При выводе – переменная преобразуется к типу char. В файл передается один байт ТИП ПЕРЕМЕННОЙ: INT Десятичное int со знаком Десятичное int со знаком Восьмеричное int unsigned Десятичное int unsigned Шестнадцатеричное int unsigned; при выводе числа используются символы 0-f Шестнадцатеричное int unsigned; при выводе числа используются символы 0-F При вводе различия х и Х не оказывают никакого эффекта ТИП ПЕРЕМЕННОЙ: FLOAT Значение со знаком в форме [-]dddd. dddd Значение со знаком в форме [-]d. dddde[+|-]ddd Значение со знаком в форме [-]d. ddddE[+|-]ddd При вводе нет различия между е и Е Значение со знаком в формате ‘e’ или ‘f’ в зависимости от значения и специфицированной точности Значение со знаком в формате ‘E’ или ‘F’ в зависимости от значения и специфицированной точности При вводе нет различия между g и G ТИП ПЕРЕМЕННОЙ: CHAR* При вводе принимает символы без преобразования до тех пор, пока не встретится ‘\n’ или пока не достигнута специфицированная точность. В программу передаются символы до ‘\n’ или пробела. При выводе выдает в поток все символы до тех пор, пока не встретится ‘\0’ или пока не достигнута специфицированная точность |
Приведем пример выполнения ввода-вывода информации:
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 |


