Типы данных С++

В данном разделе будут рассмотрены основные типы данных в С++, эти типы данных ещё называются встроенными. Язык программирования С++ является расширяемым языком программирования. Понятие расширяемый означает то, что кроме встроенных типов данных, можно создавать свои типы данных. Поэтому в С++ существует огромное количество типов данных. Мы будем изучать только основные из них.

Таблица 1 — Типы данных С++
Тип байт Диапазон принимаемых значений

целочисленный (логический) тип данных

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 или falsetrue — если логическое выражение истинно, 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.

CppStudio.com
true = 1
Для продолжения нажмите любую клавишу . . .

Рисунок 1 — Тип данных bool

Тип данных char

Тип данных char — это целочисленный тип данных, который используется для представления символов. То есть, каждому символу соответствует определённое число из диапазона [0;255]. Тип данных char также ещё называют символьным типом данных, так как графическое представление символов в С++ возможно благодаря char. Для представления символов в C++ типу данных char отводится один байт, в одном байте — 8 бит, тогда возведем двойку в степень 8 и получим значение 256 — количество символов, которое можно закодировать. Таким образом, используя тип данных char  можно отобразить любой из 256 символов. Все закодированные символы представлены в таблице ASCII. 

ASCII ( от англ. American Standard Code for Information Interchange) — американский стандартный код для обмена информацией.

Рассмотрим программу с использованием типа данных 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.

CppStudio.com
symbol = a
string = cppstudio.com
Для продолжения нажмите любую клавишу . . .

Рисунок 2 — Тип данных char

Целочисленные типы данных

Целочисленные типы данных используются для представления чисел. В таблице 1 их аж шесть штук: short intunsigned short intintunsigned intlong intunsigned long intВсе они имеют свой собственный размер занимаемой памяти и  диапазоном принимаемых значений. В зависимости от компилятора, размер занимаемой памяти и диапазон принимаемых значений могут изменяться. В таблице 1 все диапазоны принимаемых значений и размеры занимаемой памяти взяты для компилятора MVS2010. Причём все типы данных в таблице 1 расположены в порядке возрастания размера занимаемой памяти и диапазона принимаемых значений. Диапазон принимаемых значений, так или иначе, зависит от размера занимаемой памяти. Соответственно, чем больше размер занимаемой памяти, тем больше диапазон принимаемых значений. Также диапазон принимаемых значений меняется в случае, если тип данных объявляется с приставкой unsigned — без знака. Приставка unsigned говорит о том, что тип данных не может хранить знаковые значения, тогда и диапазон положительных значений увеличивается в два раза, например, типы данных short int и unsigned short int.

Приставки целочисленных типов данных:

short — приставка укорачивает тип данных, к которому применяется, путём уменьшения размера занимаемой памяти;

long приставка удлиняет тип данных, к которому применяется, путём увеличения размера занимаемой памяти;

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

Так, что, по сути, мы имеем один целочисленный тип для представления целых чисел — это тип данных int. Благодаря приставкам shortlong, 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.

CppStudio.com
     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
Практика

К сожалению, для данной темы пока нет подходящих задач. Если у вас есть таковые на примете, отправте их по адресу: admin@cppstudio.com. Мы их опубликуем!

Автор: admin
Дата: 25.08.2012
Поделиться:

Комментарии

  1. 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).

     

  2. STUNN3R

    Данная статья неполна и некорректна.
    Пруф: https://msdn.microsoft.com/ru-ru/library/s3f49ktz.aspx

    Просьба переделать таблицу типов согласно приведённым данным.

    • VV

      Ваша отсылка на microsoft некорректна, поскольку в VS поддерживаются не только стандартные типа. Например _int8 не является стандартным типом, а например, типа long long (или как любит студия _int64) изначально не было

       

  3. Multimen

    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;
    }

     

  4. MyJisio

    Anastasija M

    Доброго времени суток!)
    Возник такой вопрос: почему при такой записи

    bool boolean = 456;

    компилятор не выдает ошибку? Если диапазон принимаемых значений типа bool от 0 до 255? Или он просто обрезает число до максимального допустимого?

    • Влад Топоревский

      Диапазон значений bool только true либо false, 1 либо 0. В таблице написано что диапазон значений от 0 до 255 потому что физически переменная bool занимает в памяти 1 байт, который может содержать в себе значения от 0 до 255. Но на практике, переменная bool принимает только 2 значения. Любое значение отличное от нуля будет приниматься как true, хоть 456, хоть 563767356723. Ошибки нет.

  5. Никита

    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

  6. Maxim Agarkov

    Всем привет. Я немного модифицировал программу с типом данных Bool и столкнулся с вопросом

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
       bool boolean;
       cout << "Enter the number: " << endl;
       cin >> boolean;
       
       if ( boolean )	//Условие оператора if
    	   cout << "true = " << boolean << endl; // Выполниться в случае истинности выражения
       else
    	   cout << "false = " << boolean << endl; // Выполниться в случае, если выражение ложно
       system ("pause");
    
       return 0;
    
    }

    Программа просит ввести число и дальше выполняет проверку true — false.

    Если ввожу число 0 — отдает false 0.

    Ввожу 1 — true 1.

    А дальше начинается хоровод.

    Все что >1 выводит экран true 204.

    Любое число больше единицы ломает программу. Что это моет быть?

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.