Значения разрядов: 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0

При использовании спецификатора signed(или при его отсутствии) старший бит числа (в данном случае – разряд с номером 15) интерпретируется как знаковый (О — положительное число, 1 — отрицательное).

Спецификатор unsigned позволяет представлять только положительные числа, при этом старший разряд рассматривается как часть кода числа. Таким образом, диапазон значений типа int зависит от спецификаторов. Диапазоны значений величин целоготипа со спецификатором unsigned выглядят так:

unsignedint(16-разрядногопроцессор): от 0 до 65 535;

unsignedint(32-разрядногопроцессор): от 0 до 4 294 967 295;

unsignedshortintилиunsignedshort(не зависимо отпроцессора): от 0 до 65 535.

По умолчанию все целочисленные типы считаются знаковыми, то есть спецификатор signed можно опускать.

Целые константы литералы можно задавать в трех форматах: в десятичном, восьмеричном и в шестнадцатеричном.

В десятичном формате целые значения записываются в обычном виде:1345 +34 -245

В восьмеричном формате сначала записывается 0 (нуль), а за ним восьмеричные разряды самого числа:011 07345 -0456

В шестнадцатеричном формате значащим разрядам числа должны предшествовать символы 0x или 0X:0x12B5 -0xAF2B 0X1FF02

Как уже говорилось ранее, константам, встречающимся в программе, приписывается тот или иной тип в соответствии с их видом. Если этот тип по каким-либо причинам не устраивает программиста, он может явно указать требуемый тип с помощью суффиксов L, l (long) и u, U (unsigned). Например, константа 32L будет иметь тип long и занимать4 байта. Можно использовать суффиксы L и U одновременно, например, Ox22UL или 05LU.

10. Вещественные типы данных.

Стандарт C++ определяет три типа данных для хранения вещественных значений: float, double и longdouble. Все эти типы предназначены для представления отрицательных и положительных значений (спецификатор unsignedк ним не применим) в разных диапазонах:

· тип floatзанимает в памяти 4 байта с диапазоном абсолютных значений от 3.4е-38 до 3.4е+38;

· тип double занимает в памяти 8 байт с диапазоном абсолютных значений от 1.7е-308 до 1.7е+308;

· тип longdoubleзанимает в памяти10 байт с диапазоном абсолютных значений от 3.4e-4932 до 3.4e+4932.

Замечание.В консольных приложениях Windowsтип данных longdoubleзанимает в памяти 8 байт, то есть ничем не отличается от типа double.

Константы вещественных типов задаются двумя способами:

· нормальный формат: 123.456или -3.14;

· экспоненциальный формат: 1.23456e2(1.23456е+2).

Дробная часть отделяется от целой части точкой, а не запятой.

По умолчанию вещественные константы трактуются как константы типа double. Для явного указания другого типа вещественной константы можно использовать суффиксы F(f) - тип floatили L (l) - тип longdouble: 3.14F - константа типа float, 3.14L- константатипаlongdouble.

Вещественные типы данных (типы данных с плавающей точкой) хранятся в памяти компьютера иначе, чем целочисленные. Внутреннее представление вещественного числа состоит из двух частей — мантиссы и порядка:

-1.2345e+2

| |

мантисса порядок

Тип float занимает 4 байта, из которых один двоичный разряд отводится подзнак мантиссы, 8 разрядов под порядок и 23 под мантиссу.

Для величин типа double, занимающих 8 байт, под порядок и мантиссу отводится 11 и 52 разряда соответственно. Длина мантиссы определяет точность числа,а длина порядка — его диапазон.

Все вычисления с вещественными значениями осуществляются приближенно, при этом, ошибки вычислений могут достигать весьма существенных значений. Это объясняется дискретностью внутреннего (машинного) представления непрерывного диапазона вещественных значений. Точность представлениязначений вещественных типов зависит от размера мантиссы. Относительная точность представлениявещественных значений остается постоянной при различных значениях порядка. Однако, абсолютная точность существенно зависит от значения порядка (с уменьшением порядка абсолютная точность возрастает).

Пример неточности вычислений:

floata = 1e30f, b;

b = a + 1e10f;

cout<<b - a<<endl; // Наэкранвыведено0

11. Особенности представления вещественных типов данных.

В С++ 3 разновидности типов:

· float – 4 байта, диапазон от 3,4* Значения разрядов: 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 - student2.ru до 3,4* Значения разрядов: 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 - student2.ru

· double– 8 байт, диапазон от 1,7* Значения разрядов: 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 - student2.ru до 1,7* Значения разрядов: 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 - student2.ru

· longdouble– 10 байт, диапазон от 3,4* Значения разрядов: 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 - student2.ru до 3,4* Значения разрядов: 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 - student2.ru

В этих примерах 3,4 и 1,7 – это мантисса.

Значения разрядов: 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 - student2.ru Значения разрядов: 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 - student2.ru Значения разрядов: 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 - student2.ru float

Значения разрядов: 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 - student2.ru Значения разрядов: 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 - student2.ru Значения разрядов: 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 - student2.ru знакпорядок мантисса

1 бит 8 бит 23 бита

Примеры:

· float a = 1e30f;

· float b = 1e10f;

12. Логический тип данных.

Величины логического типа могут принимать только значения true и false, являющиеся зарезервированными словами. Внутренняя форма представления значения false - О (нуль). Любое другое значение интерпретируется как true. При преобразовании к целому типу true имеет значение 1(единица).

В памяти переменные этого типа занимают 1 байт.

Определения переменных этого типа выглядят, например, так:boolb1, b2 = true, b3 (false), b4 = 1, b5 = 0;

Константы – литералы задаются ключевыми словами true и false.

Именованные константы этого типа особого смысла не имеют, но имеют право на существование.

13. Символьный тип данных.

Для обозначения этого типа используется ключевое слово char.

Под величину символьного типа отводится количество байт, достаточное для размещения любого символа из набора символов для данного компьютера, что и обусловило название типа. Как правило, это 1 байт. Тип char, как и другие целые типы, может быть со знаком или без знака. В величинах со знаком можно хранить значения в диапазоне от -128 до 127. По умолчанию тип char являемся знаковым, то есть спецификатор signed использовать не обязательно. При использовании спецификатора unsigned значения могут находиться в пределах от 0 до 255. Этого достаточно для хранения любого символа из 256-символьного набора ASCII. Величины типа char могут применяться и для хранения целых чисел, не выходящих за границы указанных диапазонов.

Спецификаторы shortи longк этому типу данных не применяются.

Константы - литералы символьного типа представляют собой символы, заключенные в апострофы. Например: ’A’ ’!’ ’#’ ’f’ ’ш’ ’я’

14. Управляющие последовательности.

В языке C++ существует понятие управляющих или ESCAPE–последовательностей.

Управляющие последовательности начинаются символом обратной косой черты и служат:

· Для представления символов, не имеющих графического изображения. Например:‘\n’ – перевод экранного курсора в начало следующей строки; ‘\t’ символ табуляции и т.д.

· Для представления некоторых специальных символов, а именно: знака косой черты, апострофа, знака вопроса и кавычки – ‘\\’, ‘\’’, ‘\?’, ‘\”’.

· Для представления любого из 256 символов таблицы ASCII с помощью его восьмеричного или шестнадцатеричного номера. Например: ‘\054’, ‘\x4A’.

Управляющая последовательность воспринимается компилятором как одиночный символ.

Если непосредственно за обратной косой чертой следует не предусмотренный символ, результат интерпретации не определен.

Если в последовательности цифр встречается недопустимая, она считается концом цифрового кода.

Допустимые варианты управляющих последовательностей приведены в следующей таблице:

Изображение Шестнадцатеричный код Назначение
Звуковой сигнал
\b Возврат на шаг
\f С Перевод страницы (формата)
\n A Перевод строки
D Возврат каретки
\t Горизонтальная табуляция
\v Вертикальная табуляция
\\ 5C Обратная косая черта
\’ Апостроф
\" Кавычка
\? 3F Вопросительный знак
\0oo 0oo - восьмеричный код символа
\xdd dd xdd- шестнадцатеричный код символа

15. Операции и выражения.

Обработка данных выполняется с помощью операций.

Операция – это действие, осуществляемое над операндами. Например: 2 + 3

Здесь операция сложения (+) выполняется над двумя операндами (2 и 3).

В зависимости от количества операндов в языке C++ имеются унарные (с одним операндом), бинарные (с двумя операндами) и одна тернарная (с тремя операндами) операция.

Из знаков операций, операндов и круглых скобок строятся выражения. В качестве операндов могут использоваться константы, переменные, функции и другие выражения (константы и переменные считаются частными случаями выражений). В результате вычисления выражения получается некоторое значение определенного типа. Тип данных значения выражения зависит от выполняемой операции (операций) и типов данных операндов.

Особенностью языка C++ является то, что некоторые операции в зависимости от контекста могут иметь разное назначение.

Ниже приведены операции характерные для рассмотренных выше арифметических типов данных.

Унарные операции
Операция Описание
++   увеличение на 1 (инкремент)
-- уменьшение на 1 (декремент)
sizeof размер объекта или тапа данных в байтах
~ поразрядное отрицание
! логическое отрицание
- арифметическое отрицание (унарный минус)
+ унарный плюс
(тип) явное преобразование типов
Бинарные операции
Операция Описание
* умножение
/ деление
% остаток от деления
+ сложение
- вычитание
<< сдвиг влево
>> сдвиг вправо
< меньше
<= меньше или равно
> больше
>= больше или равно
== равно
!= не равно
& поразрядная конъюнкция (И)
^ поразрядное исключающее ИЛИ
| поразрядная дизъюнкция (ИЛИ)
&& логическое И
|| логическое ИЛИ

Особое значение имеет операция присвоения и ее модификации:

Операция Краткое описание
= присваивание
*= умножение с присваиванием
/= деление с присваиванием
%= остаток отделения с присваиванием
+= сложение с присваиванием
-= вычитание с присваиванием
<<= сдвиг влево с присваиванием
>>= сдвиг вправо с присваиванием
&= поразрядное И с присваиванием
|= поразрядное ИЛИ с присваиванием
^= поразрядное исключающее ИЛИ с присваиванием
Тернарная операция
Операция Описание
?: условная операция

При записи в тексте программы обозначений операций из двух и более символов, между этими символами не должно быть никаких пробельных символов (пробелов, символов табуляции, конца строки).

16. Операция присваивания, составные операции присваивания.

Одна из наиболее часто используемых операций. Формат операции:

<Переменная> = <Выражение>

| |

Операнд 1 Операнд 2

Например: a = b; b = 3 * a; c = 1.234;

Сначала вычисляется значение выражения с правой стороны, а затем полученное значение присваивается переменной в левой части операции (значение выражения записывается в область памяти переменной). Старое значение переменной при этом безвозвратно теряется.

При выполнении операции присваивания тип значения выражения автоматически преобразуется к типу левого операнда (к типу данных переменной в левой части). При этом возможны потери данных или точности. Например:

#include <iostream>

using namespace std;

Intmain()

{

inti = 100000, k;

shortj = 10000, m;

k = j; // Короткое целое преобразуется к целому без потерь

m = i; // Преобразованиецелого к короткому целому приводит к искажению данных

cout<<k<< " " <<m<<endl; // На экран будет выведено: 10000 -31072

k = 12500;

m = k; // Потери данных нет

cout<<k<< " " <<m<<endl; // На экран будет выведено: 12500 12500

doubled = 1.8234, n1, n2;

n1 = i; // Без ошибок

n2 = j; // Без ошибок

k = d; // С потерей точности

j = d; // С потерей точности

/* На экран будет выведено: 100000 10000 1 1 */

cout<<n1 << " " <<n2 << " " <<k<< " " <<j<<endl;

d = 1e+100;

k = d; // С потерей данных

m = d; // С потерей данных

/* На экран будет выведено: 1е+100 -2147483648 0 */

cout<< d << " " << k << " " << m <<endl;

system("Pause");

return 0;

}

Операция присваивания в свою очередь является выражением, значением которого является значение переменной в левой части после присваивания (эту переменную часто называют L-значением (от слова left– левая сторона)).Например:

#include<iostream>

usingnamespacestd;

Intmain()

{

inti = 7, j = 30, k;

cout<<i * j<<endl;

cout<< (k = i * j) <<endl;

cout<< k <<endl;

system("Pause");

return 0;

}

Результат работы программы: 210,210, 210.

Благодаря тому, что операция присваивания является выражением, в языке C++ возможно множественное присваивание: <Переменная1> = <Переменная2> = … = <ПеременнаяN> = <Выражение>. Например:

#include <iostream>

using namespace std;

Int main()

{

inti = 7, j = 30, k, l, m, n;

k = l = m = n = i + j;

cout<< k << " " << l << " " << m << " " << n << " " <<endl;

system("Pause");

return 0;

}

Результат работы программы: 37 37 37 37

Операция присваивания имеет самый низкий приоритет

Наши рекомендации