Перед тем как приступить к изучению типов данных, следует понять как устроена память компьютера.

Двоичные числа и память компьютера

Самым маленьким строительным блоком памяти является бит. Бит может принимать два значения: ноль и единицу. На физическом уровне работу бита выполняют минимум шесть транзисторов. 6 - минимальное число транзистров с которого можно начинать строить работающие ячейки памяти. Переключение значений бита между нулём и единицей выполняется напряжением. Например: есть напряжение на входе, значит бит принимает значение 1, нет напряжения - значение 0.

Современный компьютер может работать только с двоичными числами (0 или 1) из-за того, что можно управлять значениями чисел используя всего два состояния напряжения: включено или выключено. Это очень надёжно. Хотя первые компьютеры использовали десятичную арифметику. Идея использования двоичной (бинарной) арифметики принадлежит Джону фон Нейману. Он оказал огромное влияние на развитие отрасли. Бинарную арифметику начали использовать с начала пятидесятых годов.

Но вернёмся к битам. Несколько битов образуют более крупную ячейку. Ещё в восьмидесятых годах число битов в ячейке могло варьироваться от одного до шестидесяти. Сейчас на всех компьютерах в одной ячейке используется восемь битов - 23, а сама ячейка называется байтом.

Итак, в одном бите - 2 значения, в одном байте - 8 битов. Чтобы подсчитать сколько значений может храниться в одном байте, нужно количество возможных значений одной ячейки возвести в степень равную количеству этих ячеек. Т.е. двойку нужно возвести в восьмую степень. Это будет - 28 = 256.

Байт - минимальная единица памяти к которой компьютер может обращаться. В современных компьютерах процессор не имеет доступа к битам напрямую. Чтобы получить значения отдельных битов нужно воспользоваться специальными средствами, например, операциями поразрядного смещения.

Более крупной единицей памяти чем байт, является слово. Слово состоит из двух байтов или 16-и битов. Слова объединяются в двойные слова (32 бита или 4 байта).

В памяти компьютера байты нумеруются по порядку. Каждый байт получает свой номер - адрес. Благодаря адресам, процессор может обращаться к отдельным байтам.

Вот теперь можно приступать к типам данных. Типы данных мы будем рассматривать от меньшего к большему.

bool

Самым "маленьким" типом данных является bool. Он может хранить всего два значения: true или false. Эти значения можно заменять на 1 или 0.

Небольшой нюанс: любое значение отличное от нуля, считается true.

Тип bool используют в основном при проверке условий.

код на языке c++
bool flag = 1; // все четыре оператора корректны
flag = 0;
flag = true; //  то же самое, что  и flag = 1
flag = false; //  то же самое, что  и flag = 0

Для хранения этого типа используется целый байт так как процессор не умеет обращаться к отдельным битам. В байте используется самый младший бит, при этом сем битов не используются.

char

Для хранения значения типа char используется один байт. Соответственно переменная данного типа может хранить 256 значений. Данный тип используется для хранения символов. чтобы числа преобразовывать в символы используется таблица ASCII. Первоначально она содержала 128 значений - от нуля до 127 то есть в байте не использовался один бит. В таком виде таблица символов хранила буквы латинского алфавита и ряд дополнительных символов. Для национальных алфавитов (греческий, русский) используется расширенная таблица ASCII, где символы нумеруются от 0 до 255.

В таблице хранятся символы и в нижнем регистре и в верхнем и, например, для хранения всех символов русского алфавита нужно 66 символов.

Ещё один момент. В четвёртом выпуске мы столкнулись с вводом "стрелочек". При этом для считывания значения функцию _getch() пришлось вызывать два раза. Это пример так называемых расширенных символов.

short

Тип short хранит целые числа при этом занимая два байта. Это - 216 или 65536 значений.

int и long

Для хранения больших целых чисел используются типы int и long. На 32-ух разрядных комьпютерах их длина совпадает - 4 байта. Но тип int - аппаратно зависимый. И на 16-ибитных или, что уже более актуально, на 64-хбитных компьютерах, он будет занимать соответственно 2 байта или 8 байт. На 32-ух битных машинах, тип int совпадает с типом long. Они могут содержать 232 значений - это больше четырёх миллиардов.

float

Для хранения вещественных чисел (с дробной частью) в C++ испольуется два типа: float и double. При этом float занимает 4 байта, а double - 8.

unsigned

По умолчанию в типах short, long, int и др. хранятся и отрицательные и положительные значения.

Соответсвенно, по умолчанию, диапазон char равен [ -128...127 ]. Один бит используется как флаг, какое значение в переменной: больше нуля или меньше.

Чтобы переменная содержала только положительные значения, можно воспользоваться ключевым словом unsigned:

unsigned long x;
insigned short y;
Теперь в переменных x и y можно хранить только положительные значения. Кроме того, переменные объявленные с ключевым словом unsigned могут хранить в два раза больше значений. Например, для типа short максимальным значением является 32768, а для типа unsigned short - 65536. Это достигается благодаря освободившемуся биту, который раньше хранил знак (плюс/минус)

Кстати, unsigned short составляет слово, а unsigned long - двойное слово.

void

Ключевое слово void говорит об отсутствии типа. С обычными переменными оно не используется, а применяется при объявлениях и определениях функций. Но более интересное применение void - с указателями. С помощью void можно указывать на любой тип. Но об этом позже.

wchar_t

Для вывода текста на русском языке мы до сих пор использовали функцию setlocale() объявленную в файле clocale. В C++ существует тип wchar_t. Он как раз предназначен для использования с национальными алфавитами. Если хотите его использовать, то приводите его значения к типу char. Пока, в программах мы не будем его использовать.

Приведение типов

Приведение (type cast) типов используется, когда в выражениях присутствуют переменные разных типов. По умолчанию используется неявное приведение типов:

код на языке c++
int a = 10;
float b = 3;
float c = 0;

c = a/b;

Здесь переменная целого типа делится на переменную вещественного типа и результат присваивается ещё одной переменной вещественного типа. Перед операцией деления переменная a приводится к типу float. Правило неявного приведения типа довольно простое: типы приводятся от меньших типов к большим. Т.е. если в выражении участвует одна переменная вещественного типа double и несколько переменных типов int, short, float, то все переменные будут приведены к типу double.

Лучше пользоваться явным приведением типов. Делается это с помощью уже знакомой нам функции static_cast<>(). В круглые скобки ставится переменная или константа, а в угловые имя типа к которому мы хотим привести эту переменную или константу.

Объявление и определение

Давайте проясним разницу между этими двумя понятиями. Например:

int x;
В данном операторе происходит и объявление и определение. Только в одном случае объявление и определение переменной происходит отдельно: когда переменная используется в нескольких файлах. При этом определение находится только в одном файле, а объявление может находиться в нескольких:

файл 1.cpp
int x = 0; // определение

файл 2.cpp
#include "1.cpp" // обратите внимание на использование кавычек с #include

extern int x; //объявление

при этом в операторе объявления ставится ключевое слово extern.

Теперь посмотрим, что же всё-таки происходит при объявлении. Когда мы объявляем переменную в программе, то при компиляции, компилятор увидит, что мы зарезервировали идентификатор переменной и даже если в этом файле нет определения и он встретит использование переменной в коде, то никак не прореагирует, потому как знает, данный идентификатор был объявлен.

При этом выделяется память под переменную и с этого момента её можно использовать.

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

typedef (переименование типов)

Полезной функцией является переименование типов. Оно очень часто используется в WinAPI. Смысл в следующем: стандартному типу присваивается новое имя. Это бывает полезно если программист хочет использовать в своей программе какие-то специфические величины, например килограммы:

typedef int kg;

Теперь можно использовать тип kg, точно также как и int.

int weight = 62; // два оператора -
kg weight = 62; // эквивалентны

Идентификаторы
Ну и последнее:
Любые переменные. функции, классы, стурктуры имеют имя или идентификатор. Идентфикатор можно составлять только из символов латинского алфавита нижнего и верхнего регистров, цифр и символа подчёркивания. Идентификатор не может начинаться с цифры.

Статья взята с shatalov.su