Представление данных
Данные это формализованное представление информации.
В компьютерной программе данные – это значение объектов программы. Данные С++ могут быть в виде констант и переменных.
Данные, которые не изменяются в программе, называются константами.
Данные зафиксированные в программе и изменяемые в ней в процессе обработки являются переменными.
Переменные, перед тем как их использовать в программе должны быть объявлены. Объявление переменной состоит в первую очередь из указания ее типа.
Понятие типа данных.
Тип данных характеризует:
внутреннее представление данных в памяти компьютера;
набор допустимых операций (действий);
множество допустимых значений.
Классификация данных языка С++. Основные и производные типы
Все типы данных можно подразделить на простые (основные) — они предопределены стандартом языка, и сложные (или составные) — задаются пользователем.
Данные простого типа нельзя разложить на более простые составляющие без потери сущности данного.
Простые типы данных создают основу для построения более сложных типов: массивов, структур, классов.
Простые типы в языке C++ — это целые, вещественные типы, символьный и логический тип и тип void.
Для определения и описания переменных основных типов используются следующие ключевые слова:
char (символьный);
short (короткий целый);
int (целый);
long (длинный целый);
float (вещественный);
double (вещественный с удвоенной точностью);
void (отсутствие значения).
В табл. 1 приведены основные типы данных с диапазоном значений и назначением типов.
В таблице базовыми типами являются: char, int, float, double, void.
Остальные получаются из них с использованием модификаторов типа:
unsigned (беззнаковый), signed (знаковый), long (длинный), shot (короткий).
Целые типы
Целый тип данных предназначен для представления в памяти компьютера обычных целых чисел.
Основным и наиболее употребительным целым типом является тип int.
Гораздо реже используют его разновидности: short (короткое целое) и long (длинное целое).
Таблица 1
По умолчанию все целые типы являются знаковыми, то есть старший бит в таких числах определяет знак числа: 0 — число положительное, 1 — число отрицательное.
Для представления отрицательного числа используется дополнительный код.
Кроме знаковых чисел на C++ можно использовать без знаковые.
В этом случае все разряды участвуют в формировании целого числа.
При описании без знаковых целых переменных добавляется слово unsigned (без знака).
Для 32-разрядных компиляторов, которые не делают различия между целыми типами int и long целые типы представлены для сравнения в табл.2.
Таблица 1
Целые типы для 32-разрядных компиляторов
Тип данных |
Размер,байт |
Диапазон значений |
char |
1 |
-128 ... 127 (-27 – 27-1) |
short |
2 |
-32768 ... 32767 (-215 – 215-1) |
int |
4 |
-2147483648 ... 2147483647 (-231 – 231-1) |
long |
4 |
-2147483648 ... 2147483647 (-231 – 231-1) |
unsigned char |
1 |
0 ... 255 ( 0 – 28-1) |
unsigned short |
2 |
0 ... 65535 ( 0 – 216-1) |
unsigned int |
4 |
0 ... 4294967295 ( 0 – 232-1) |
unsigned long |
4 |
0 ... 4294967295 ( 0 – 232-1) |
Простые типы данных. Целочисленные типы.
1. short, short int, signed short – синонимы коротких целых со знаком
2. unsigned short – короткие целые без знака
3. int, signed int – целые со знаком
4. unsigned, unsigned int– целые без знака.
5. long, long int – длинные целые со знаком.
6. unsigned long, unsigned long int
7. int64, long long–сверхдлинные знаковые 8 байт (от -263 до 263-1)
В каждой группе указан один целочисленный тип. Соответствующие записи являются синонимами. Большинство популярных компиляторов являются многоплатформенными. Размер типов будет зависеть от целевой платформы компилятора.
В чем разница между int и long на С++?
В настоящее время появились 64-разрядные процессоры. Необходимо различать 16-разрядные целые числа, 32-разрядные целые числа и 64- разрядные целые числа.
Поэтому был введен дополнительный целый тип long long. Имейте в виду, что нужно было сохранять обратную совместимость с целыми типами, введенными ранее для процессоров с меньшей разрядностью.
Поэтому в стандарте C принято, что
sizeof (short ) <= sizeof( int )
sizeof( int ) <= sizeof( long )
sizeof( long ) <= sizeof( long long )
У разработчиков компиляторов есть свобода выбора, какая разрядность будет у типа long и других целочисленных типов. Например, разрядность типа long может составлять не `32 бита, а 64 бита.
Чтобы программы были переносимы, возникла необходимость вводить новые типы со строго указанной разрядностью такие, как, например, int_least32_t или int32_t.
На одних 64-битовых платформах тип long и тип long long могут иметь 64-битовую разрядность. На других 64-битовых платформах тип long может быть 32-битовым и тип int также может быть 32-битовым, а тип long long - 64 битовым.
Тем не менее ранг типа long long больше ранга типа long, а тип long в свою очередь имеет ранг выше, чем тип int.
На этом основываются правила преобразования типов в выражениях. Например, если тип long и тип int имеют разрядность равную 32 битам, то в следующем фрагменте кода
long x = 0;
unsigned int y = 0;
x + y;
тип выражения x + y имеет тип unsigned long.
В языке С++ система целочисленных типов обладает тем свойством, что
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
т.е. вполне возможно, что размеры (и диапазоны) этих типов все будут различными.
В языке С, по каким-то историческим причинам, это соотношение определяется как
диапазон (signed char) ⊆ диапазон(short) ⊆ диапазон(int) ⊆ диапазон(long) ⊆ диапазон (long long)
Но идея, понятное дело, в обоих случаях одна и та же. И все эти типы могут быть различными с точки зрения диапазона. Как, впрочем, все они могу быть и одинаковыми с точки зрения размера и диапазона.
То, что у вас на какой-то платформе тип long совпал по представлению с типом int является лишь особенностью вашей платформы.
Символьный тип
В стандарте C++ для представления символьной информации есть два типа данных, пригодных для этой цели, — это типы char и wchar_t.
Тип char используется для представления символов в соответствии с системой кодировки ASCII (American Standard Code for Information Interchange — Американский стандартный код обмена информации).
Это семибитовый код, его достаточно для кодировки 128 различных символов с кодами от 0 до 127.
Символы с кодами от 128 до 255 используются для кодирования национальных алфавитов, символов псевдографики и др.
Тип wchar_t предназначен для работы с набором символов, для кодировки которых недостаточно 1 байта, например, Unicode.
Размер типа wchar_t обычно равен 2 байтам. Если в программе необходимо использовать строковые константы типа wchar_t, то их записывают с префиксом L, например, L"Слово".
Таким образом, значениями символьных данных являются целые числа – значения их внутреннего кода. Однако в операторах ввода/вывода фигурируют сами символы, что иллюстрирует следующая программа:
#include <iostream>
using namespace std;
char c, b ;
void main ()
{ c=’*’; b= 55;
cout<<c<<’\t’<<b<<’\t’;
cout<< (int)c;
}
Результатом будет:
* 7 42
Вывелись символы '*' и символ с кодом 55 – символ '7'. И код символа '*', как результат приведения типа символа к целому типу.
Логический тип
Логический (булевый) тип обозначается словом bool.
Данные булевого типа могут принимать только два значения: true и false и занимают в памяти 1 байт. Значение false обычно равно числу 0, значение true — числу 1.
Вещественные типы
Особенностью вещественных (действительных) чисел является то, что в памяти компьютера они практически всегда хранятся приближенно.
Имеется три вещественных типа данных: float, double и long double.
Основным считается тип double. Так, все математические функции по умолчанию работают именно с типом double.
В табл. 3 приведены основные характеристики вещественных типов.
Таблица 3
Основные характеристики вещественных типов
Тип данных |
Размер, байт |
Диапазон абсолютных величин |
Точность, количество десятичных цифр |
float |
4 |
от 3.4Е—38 до 3.4Е+38 |
7— 8 |
double |
8 |
от 1.7Е—308 до 1.7Е+308 |
15— 16 |
Long double |
10 (12) |
от 3.4E-4932 до 1.1E+4932 |
19 — 20 |
Рекомендуется везде использовать тип double.
Работа с ним всегда ведётся быстрее, меньше вероятность заметной потери точности при большом количестве вычислений.
#include "stdafx.h"
#include <iostream>
// библиотека манипулирования вводом/выводом
#include<iomanip>
// заголовочный файл математических функций
#include<cmath>
using namespace std;
int main( )
{
cout // заголовки столбцов
<< " data type " << "byte" << " " << " max value " <<endl
//вычисляем максимальное значение для типа данных bool
<< "bool ="<<sizeof(bool) << " " << fixed <<setprecision(2)<< (pow(2,sizeof(bool) * 8.0) - 1) <<endl
//вычисляем максимальное значение для типа данных char
<< "char = "<<sizeof(char) << " " << fixed <<setprecision(2)<< (pow(2,sizeof(char) * 8.0) - 1) <<endl
//вычисляем максимальное значение для типа данных short int
<< "short int = " <<sizeof(short int) << " " << fixed <<setprecision(2) << (pow(2,sizeof(short int) * 8.0 - 1) - 1) <<endl
//вычисляем макс. Значение для типа данных unsigned short int<< "unsigned short int=" <<sizeof(unsigned short int) << " " << fixed <<setprecision(2)<< (pow(2,sizeof(unsigned short int) * 8.0) - 1) <<endl
//вычисляем максимальное значение для типа данных int
<< "int= " <<sizeof(int)<< " " << fixed <<setprecision(2)<< (pow(2,sizeof(int) * 8.0 - 1) - 1) <<endl
//вычисляем макс. значение для типа данных unsigned int
<< "unsigned int = " <<sizeof(unsigned int) << " " << fixed <<setprecision(2)<< (pow(2,sizeof(unsigned int) * 8.0) - 1) <<endl
//вычисляем максимальное значение для типа данных long int<< "long int = " <<sizeof(long int) << " " << fixed <<setprecision(2)<< (pow(2,sizeof(long int) * 8.0 - 1) - 1) <<endl
//вычисляем макс. значениедля типа данных unsigned long int<< "unsigned long int = " <<sizeof(unsigned long int) << " "<< fixed <<setprecision(2)<<(pow(2,sizeof(unsigned long int) * 8.0) - 1) <<endl
system("pause");
return 0;}
Результат:
data type byte max value
bool = 1 255.00
char= 1 255.00
short int = 2 32767.00
unsigned short int = 2 65535.00
int = 4 2147483647.00
unsigned int = 4 4294967295.00
long int= 4 2147483647.00
unsigned long int = 4 4294967295.00
Для продолжения нажмите любую клавишу . . .
#include "stdafx.h"
#include <iostream>
// библиотека манипулирования вводом/выводом
#include<iomanip>
// заголовочный файл математических функций
#include<cmath>
using namespace std;
int main()
{
cout // заголовки столбцов
<< " data type " << "byte" << " " << " max value " << endl
//вычисляем максимальное значение для типа данных bool
<< "bool =" << sizeof(bool) << " " << fixed << setprecision(2) << (pow(2, sizeof(bool) * 8.0) - 1) << endl
//вычисляем максимальное значение для типа данных char
<< "char = " << sizeof(char) << " "
<< fixed << setprecision(2) << (pow(2, sizeof(char) * 8.0) - 1) << endl
//вычисляем максимальное значение для типа данных short int
<< "short int = " << sizeof(short int) << " "
<< fixed << setprecision(2) << (pow(2, sizeof(short int) * 8.0 - 1) - 1) << endl
//вычисляем макс. Значение для типа данных unsigned short int<< "unsigned short int=" <<sizeof(unsigned short int) << " " << fixed <<setprecision(2)<< (pow(2,sizeof(unsigned short int) * 8.0) - 1) <<endl
//вычисляем максимальное значение для типа данных int
<< "int= " << sizeof(int) << " "
<< fixed << setprecision(2) << (pow(2, sizeof(int) * 8.0 - 1) - 1) << endl
//вычисляем макс. значение для типа данных unsigned int
<< "unsigned int = " << sizeof(unsigned int) << " " << fixed << setprecision(2) << (pow(2, sizeof(unsigned int) * 8.0) - 1) << endl
//вычисляем максимальное значение для типа данных long int
<< "long int = " <<sizeof(long int) << " " << fixed <<setprecision(2)<< (pow(2,sizeof(long int) * 8.0 - 1) - 1) <<endl
//вычисляем макс. значениедля типа данных unsigned long int
<< "unsigned long int = " <<sizeof(unsigned long int) << " "<< fixed <<setprecision(2)<<(pow(2,sizeof(unsigned long int) * 8.0) - 1) <<endl;
system("pause");
return 0;
}
Тип void
Тип void — самый необычный тип данных языка C++. Нельзя определить переменную этого типа. Тем не менее, это очень полезный тип данных. Он используется:
для определения функций, которые не возвращают результата своей работы;
для указания того, что список параметров функции пуст;
а также этот тип является базовым для работы с указателями.
Указатель на тип void - указатель ни на что, но который может быть приведен к любому типу указателей.
Так всё программирование с использованием Win32 API построено на применении указателей на тип void.
Новое обозначение типа
Используя спецификатор typedef можно в программе вводить удобное обозначение для сложных обозначений типов по следующему правилу:
