В данном разделе будут рассмотрены основные типы данных в С++, эти типы данных ещё называются встроенными. Язык программирования С++ является расширяемым языком программирования. Понятие расширяемый означает то, что кроме встроенных типов данных, можно создавать свои типы данных. Поэтому в С++ существует огромное количество типов данных. Мы будем изучать только основные из них.
Тип | байт | Диапазон принимаемых значений |
---|---|---|
целочисленный (логический) тип данных |
||
bool | 1 | 0 / 255 |
целочисленный (символьный) тип данных |
||
char | 1 | 0 / 255 |
целочисленные типы данных |
||
short int | 2 | -32 768 / 32 767 |
unsigned short int | 2 | 0 / 65 535 |
int | 4 | -2 147 483 648 / 2 147 483 647 |
unsigned int | 4 | 0 / 4 294 967 295 |
long int | 4 | -2 147 483 648 / 2 147 483 647 |
unsigned long int | 4 | 0 / 4 294 967 295 |
типы данных с плавающей точкой |
||
float | 4 | -2 147 483 648.0 / 2 147 483 647.0 |
long float | 8 | -9 223 372 036 854 775 808 .0 / 9 223 372 036 854 775 807.0 |
double | 8 | -9 223 372 036 854 775 808 .0 / 9 223 372 036 854 775 807.0 |
В таблице 1 представлены основные типы данных в С++. Вся таблица делится на три столбца. В первом столбце указывается зарезервированное слово, которое будет определять, каждое свой, тип данных. Во втором столбце указывается количество байт, которое отводится под переменную с соответствующим типом данных. В третьем столбце показан диапазон допустимых значений. Обратите внимание на то, что в таблице все типы данных расположены от меньшего к большему.
Тип данных bool
Первый в таблице — это тип данных bool
— целочисленный тип данных, так как диапазон допустимых значений — целые числа от 0 до 255. Но как Вы уже заметили, в круглых скобочках написано — логический тип данных, и это тоже верно. Так как bool
используется исключительно для хранения результатов логических выражений. У логического выражения может быть один из двух результатов true
или false
. true
— если логическое выражение истинно, false
— если логическое выражение ложно.
Но так как диапазон допустимых значений типа данных bool
от 0 до 255, то необходимо было как-то сопоставить данный диапазон с определёнными в языке программирования логическими константами true
и false
. Таким образом, константе true
эквивалентны все числа от 1 до 255 включительно, тогда как константе false
эквивалентно только одно целое число — 0. Рассмотрим программу с использованием типа данных bool
.
// data_type.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include <iostream> using namespace std; int main(int argc, char* argv[]) { bool boolean = 25; // переменная типа bool с именем boolean if ( boolean ) // условие оператора if cout << "true = " << boolean << endl; // выполнится в случае истинности условия else cout << "false = " << boolean << endl; // выполнится в случае, если условие ложно system("pause"); return 0; }
В строке 9 объявлена переменная типа bool
, которая инициализирована значением 25. Теоретически после строки 9, в переменной boolean
должно содержаться число 25, но на самом деле в этой переменной содержится число 1. Как я уже говорил, число 0 — это ложное значение, число 1 — это истинное значение. Суть в том, что в переменной типа bool
могут содержаться два значения — 0 (ложь) или 1 (истина). Тогда как под тип данных bool
отводится целый байт, а это значит, что переменная типа bool
может содержать числа от 0 до 255. Для определения ложного и истинного значений необходимо всего два значения 0 и 1. Возникает вопрос: «Для чего остальные 253 значения?».
Исходя из этой ситуации, договорились использовать числа от 2 до 255 как эквивалент числу 1, то есть истина. Вот именно по этому в переменной boolean
содержится число 25 а не 1. В строках 10 -13 объявлен оператор условного выбора if, который передает управление оператору в строке 11, если условие истинно, и оператору в строке 13, если условие ложно. Результат работы программы смотреть на рисунке 1.
true = 1 Для продолжения нажмите любую клавишу . . .
Рисунок 1 — Тип данных bool
Тип данных char
Тип данных char
— это целочисленный тип данных, который используется для представления символов. То есть, каждому символу соответствует определённое число из диапазона [0;255]. Тип данных char
также ещё называют символьным типом данных, так как графическое представление символов в С++ возможно благодаря char
. Для представления символов в C++ типу данных char
отводится один байт, в одном байте — 8 бит, тогда возведем двойку в степень 8 и получим значение 256 — количество символов, которое можно закодировать. Таким образом, используя тип данных char
можно отобразить любой из 256 символов. Все закодированные символы представлены в таблице ASCII.
Рассмотрим программу с использованием типа данных char
.
// symbols.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include <iostream> using namespace std; int main(int argc, char* argv[]) { char symbol = 'a'; // объявление переменной типа char и инициализация её символом 'a' cout << "symbol = " << symbol << endl; // печать символа, содержащегося в переменной symbol char string[] = "cppstudio.com"; // объявление символьного массива (строки) cout << "string = " << string << endl; // печать строки system("pause"); return 0; }
Итак, в строке 9 объявлена переменная с именем symbol
, ей присвоено значение символа 'a'
(ASCII код). В строке 10 оператор cout
печатает символ, содержащийся в переменной symbol
. В строке 11 объявлен строковый массив с именем string
, причём размер массива задан неявно. В строковый массив сохранена строка "cppstudio.com"
. Обратите внимание на то, что, когда мы сохраняли символ в переменную типа char
, то после знака равно мы ставили одинарные кавычки, в которых и записывали символ. При инициализации строкового массива некоторой строкой, после знака равно ставятся двойные кавычки, в которых и записывается некоторая строка. Как и обычный символ, строки выводятся с помощью оператора cout
, строка 12. Результат работы программы показан на рисунке 2.
symbol = a string = cppstudio.com Для продолжения нажмите любую клавишу . . .
Рисунок 2 — Тип данных char
Целочисленные типы данных
Целочисленные типы данных используются для представления чисел. В таблице 1 их аж шесть штук: short int
, unsigned short int
, int
, unsigned int
, long int
, unsigned long int
. Все они имеют свой собственный размер занимаемой памяти и диапазоном принимаемых значений. В зависимости от компилятора, размер занимаемой памяти и диапазон принимаемых значений могут изменяться. В таблице 1 все диапазоны принимаемых значений и размеры занимаемой памяти взяты для компилятора MVS2010. Причём все типы данных в таблице 1 расположены в порядке возрастания размера занимаемой памяти и диапазона принимаемых значений. Диапазон принимаемых значений, так или иначе, зависит от размера занимаемой памяти. Соответственно, чем больше размер занимаемой памяти, тем больше диапазон принимаемых значений. Также диапазон принимаемых значений меняется в случае, если тип данных объявляется с приставкой unsigned
— без знака. Приставка unsigned
говорит о том, что тип данных не может хранить знаковые значения, тогда и диапазон положительных значений увеличивается в два раза, например, типы данных short int
и unsigned short int
.
Приставки целочисленных типов данных:
short
— приставка укорачивает тип данных, к которому применяется, путём уменьшения размера занимаемой памяти;
long
— приставка удлиняет тип данных, к которому применяется, путём увеличения размера занимаемой памяти;
unsigned
(без знака) — приставка увеличивает диапазон положительных значений в два раза, при этом диапазон отрицательных значений в таком типе данных храниться не может.
Так, что, по сути, мы имеем один целочисленный тип для представления целых чисел — это тип данных int
. Благодаря приставкам short
, long
, unsigned
появляется некоторое разнообразие типов данных int
, различающихся размером занимаемой памяти и (или) диапазоном принимаемых значений.
Типы данных с плавающей точкой
В С++ существуют два типа данных с плавающей точкой: float
и double
. Типы данных с плавающей точкой предназначены для хранения чисел с плавающей точкой. Типы данных float
и double
могут хранить как положительные, так и отрицательные числа с плавающей точкой. У типа данных float
размер занимаемой памяти в два раза меньше, чем у типа данных double
, а значит и диапазон принимаемых значений тоже меньше. Если тип данных float
объявить с приставкой long
, то диапазон принимаемых значений станет равен диапазону принимаемых значений типа данных double
. В основном, типы данных с плавающей точкой нужны для решения задач с высокой точностью вычислений, например, операции с деньгами.
Итак, мы рассмотрели главные моменты, касающиеся основных типов данных в С++. Осталось только показать, откуда взялись все эти диапазоны принимаемых значений и размеры занимаемой памяти. А для этого разработаем программу, которая будет вычислять основные характеристики всех, выше рассмотренных, типов данных.
// data_types.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include <iostream> // библиотека манипулирования вводом/выводом #include <iomanip> // заголовочный файл математических функций #include <cmath> using namespace std; int main(int argc, char* argv[]) { cout << " data type " << "byte" << " " << " max value " << endl // заголовки столбцов << "bool = " << sizeof(bool) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных bool*/ << (pow(2,sizeof(bool) * 8.0) - 1) << endl << "char = " << sizeof(char) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных char*/ << (pow(2,sizeof(char) * 8.0) - 1) << endl << "short int = " << sizeof(short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных short int*/ << (pow(2,sizeof(short int) * 8.0 - 1) - 1) << endl << "unsigned short int = " << sizeof(unsigned short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned short int*/ << (pow(2,sizeof(unsigned short int) * 8.0) - 1) << endl << "int = " << sizeof(int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных int*/ << (pow(2,sizeof(int) * 8.0 - 1) - 1) << endl << "unsigned int = " << sizeof(unsigned int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned int*/ << (pow(2,sizeof(unsigned int) * 8.0) - 1) << endl << "long int = " << sizeof(long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long int*/ << (pow(2,sizeof(long int) * 8.0 - 1) - 1) << endl << "unsigned long int = " << sizeof(unsigned long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных undigned long int*/ << (pow(2,sizeof(unsigned long int) * 8.0) - 1) << endl << "float = " << sizeof(float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных float*/ << (pow(2,sizeof(float) * 8.0 - 1) - 1) << endl << "double = " << sizeof(double) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных double*/ << (pow(2,sizeof(double) * 8.0 - 1) - 1) << endl; system("pause"); return 0; }
Данная программа выложена для того, чтобы Вы смогли просмотреть характеристики типов данных в своей системе. Не стоит разбираться в коде, так как в программе используются управляющие операторы, которые Вам, вероятнее всего, ещё не известны. Для поверхностного ознакомления с кодом программы, ниже поясню некоторые моменты. Оператор sizeof()
вычисляет количество байт, отводимое под тип данных или переменную. Функция pow(x,y)
возводит значение х
в степень y
, данная функция доступна из заголовочного файла <cmath>
. Манипуляторы fixed
и setprecision()
доступны из заголовочного файла <iomanip>
. Первый манипулятор — fixed
, передаёт в поток вывода значения в фиксированной форме. Манипулятор setprecision(n)
отображает n
знаков после запятой. Максимальное значение некоторого типа данных вычисляется по такой формуле:
max_val_type = 2^(b * 8 - 1) - 1; // для типов данных с отрицательными и положительными числами // где, b - количество байт выделяемое в памяти под переменную с таким типом данных // умножаем на 8, так как в одном байте 8 бит // вычитаем 1 в скобочках, так как диапазон чисел надо разделить надвое для положительных и отрицательных значений // вычитаем 1 в конце, так как диапазон чисел начинается с нуля // типы данных с приставкой unsigned max_val_type = 2^(b * 8 ) - 1; // для типов данных только с положительными числами // пояснения к формуле аналогичные, только в скобочка не вычитается единица
Пример работы программы можно увидеть на рисунке 3. В первом столбце показаны основные типы данных в С++, во втором столбце размер памяти, отводимый под каждый тип данных и в третьем столбце — максимальное значение, которое может содержать соответствующий тип данных. Минимальное значение находится аналогично максимальному. В типах данных с приставкой unsigned
минимальное значение равно 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 float = 4 2147483647.00 double = 8 9223372036854775808.00 Для продолжения нажмите любую клавишу . . .
Рисунок 3 — Типы данных С++
Если, например, переменной типа short int
присвоить значение 33000, то произойдет переполнение разрядной сетки, так как максимальное значение в переменной типа short int
это 32767. То есть в переменной типа short int
сохранится какое-то другое значение, скорее всего будет отрицательным. Раз уж мы затронули тип данных int
, стоит отметить, что можно опускать ключевое слово int
и писать, например, просто short
. Компилятор будет интерпретировать такую запись как short int
. Тоже самое относится и к приставкам long
и unsigned
. Например:
// сокращённая запись типа данных int short a1; // тоже самое, что и short int long a1; // тоже самое, что и long int unsigned a1; // тоже самое, что и unsigned int unsigned short a1; // тоже самое, что и unsigned short int
Комментарии
AlexD
Поддерживаю STUNN3R
Статья с ошибками.
Диапазон значений вещественных чисел указан некорректно.
Например, максимальный float не 2 147 483 647, а 3.4Е+38
Источник: https://www.tutorialspoint.com/cprogramming/c_data_types.htm и https://msdn.microsoft.com/ru-ru/library/s3f49ktz(v=vs.120).aspx
Для проверки пусть автор при выводе значения double попробует после возведения в степень отнять не 1, а 2 (ничего не изменится) или 1000 (отнимется 1024).
STUNN3R
Данная статья неполна и некорректна.
Пруф: https://msdn.microsoft.com/ru-ru/library/s3f49ktz.aspx
Просьба переделать таблицу типов согласно приведённым данным.
VV
Multimen
Как ответ, тип double способен принимать значения до 170!(факториал), long double до 1754!. Объясните причину пожалуйста. Вот подтверждение код Dev-C++:
#include <iostream>
#include <windows.h>
#include <iomanip>
using namespace std;
int main()
{
//setlocale(0, «»);
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
int counter,n; double fact = 1;
cout<<«Введите число 1 до 170″<<endl;
cin>>n;
for(counter=1;counter<=n;counter++)
fact=fact*counter;
cout<<«Факториал = «<<fixed<<setprecision(1)<<fact<<endl;
return 0;
}
Anastasija M
Доброго времени суток!)
Возник такой вопрос: почему при такой записи
компилятор не выдает ошибку? Если диапазон принимаемых значений типа bool от 0 до 255? Или он просто обрезает число до максимального допустимого?
Влад Топоревский
Диапазон значений bool только true либо false, 1 либо 0. В таблице написано что диапазон значений от 0 до 255 потому что физически переменная bool занимает в памяти 1 байт, который может содержать в себе значения от 0 до 255. Но на практике, переменная bool принимает только 2 значения. Любое значение отличное от нуля будет приниматься как true, хоть 456, хоть 563767356723. Ошибки нет.
Nikita Kravts
Доброго времени суток.
Я пользуюсь средой Code Blocks.
Расшифруйте пожалуйста эту строку
int
main(
int
argc,
char
* argv[])
и чем она отличается от int main()
на работу программ не влияет, я всегда пишу просто 2-й вариант.
Может далее все станет ясно и пока не заморачиваться?
Max Petrov
Это обычные аргументы функции, только исполняющей функции » main/. Я подозреваю, что они просто тут из за «копипаста» или это неведомые мне особенности программирования на unix. Можешь смело писать int main(). Сам я не сталкивался со случаями использования их в этой функции по этому не берусь объяснить в какой программе они могут понадобиться.
Александр Михайлов
это входные параметры переданные при запуске программы из консоли (ключи)
# programm -key -key2
тогда первый аргумент будет содержать 2 — кол — во ключей, а второй массив с самими ключи argv[1] = -key2
Maxim Agarkov
Всем привет. Я немного модифицировал программу с типом данных Bool и столкнулся с вопросом
Программа просит ввести число и дальше выполняет проверку true — false.
Если ввожу число 0 — отдает false 0.
Ввожу 1 — true 1.
А дальше начинается хоровод.
Все что >1 выводит экран true 204.
Любое число больше единицы ломает программу. Что это моет быть?
PayL
В описании типа данных сhar не объяснено назначение квадратных скобочек в 11 строчке string[]
nataliadolfin
Это значит что массив задан не однозначно, т.е. он может быть любого размера
PayL
Я так понял что любое число не равное нулю — равно единице для boul (Независимо больше оно чем 255, или вобще со знаком минус, главное не ноль).
Александр Михайлов
такая же фигня, только пишет 119.
если boolean сделать не bool, а int, то все нормально работает
Demond
всё просто если нуль то в любом случае false а что не нуль то истина true