01. C/C++ Типы данных, переменные

C/C++ Типы данных, переменные

Для того чтобы программировать — нам надо уметь создавать и оперировать с числами.
В языках программирования C и C++ для этого существуют некие контейнеры/оболочки предоставляющие доступ к наиболее удобным типам данных:

 

  • bool: логический тип. Может принимать одну из двух значений true (истина) и false (ложь). Размер занимаемой памяти для этого типа точно не определен.
  • char: представляет один символ в кодировке ASCII. Занимает в памяти 1 байт (8 бит). Может хранить любое значение из диапазона от -128 до 127, либо от 0 до 255
  • signed char: представляет один символ. Занимает в памяти 1 байт (8 бит). Может хранить любой значение из диапазона от -128 до 127
  • unsigned char: представляет один символ. Занимает в памяти 1 байт (8 бит). Может хранить любой значение из диапазона от 0 до 255
  • wchar_t: представляет расширенный символ. На Windows занимает в памяти 2 байта (16 бит), на Linux — 4 байта (32 бита). Может хранить любой значение из диапазона от 0 до 65 535 (при 2 байтах), либо от 0 до 4 294 967 295 (для 4 байт)
  • char16_t: представляет один символ в кодировке Unicode. Занимает в памяти 2 байта (16 бит). Может хранить любой значение из диапазона от 0 до 65 535
  • char32_t: представляет один символ в кодировке Unicode. Занимает в памяти 4 байта (32 бита). Может хранить любой значение из диапазона от 0 до 4 294 967 295
  • short: представляет целое число в диапазоне от –32768 до 32767. Занимает в памяти 2 байта (16 бит).Данный тип также имеет синонимы short intsigned short intsigned short.
  • unsigned short: представляет целое число в диапазоне от 0 до 65535. Занимает в памяти 2 байта (16 бит).Данный тип также имеет синоним unsigned short int.
  • int: представляет целое число. В зависимости от архитектуры процессора может занимать 2 байта (16 бит) или 4 байта (32 бита). Диапазон предельных значений соответственно также может варьироваться от –32768 до 32767 (при 2 байтах) или от −2 147 483 648 до 2 147 483 647 (при 4 байтах). Но в любом случае размер должен быть больше или равен размеру типа short и меньше или равен размеру типа longДанный тип имеет синонимы signed int и signed.
  • unsigned int: представляет положительное целое число. В зависимости от архитектуры процессора может занимать 2 байта (16 бит) или 4 байта (32 бита), и из-за этого диапазон предельных значений может меняться: от 0 до 65535 (для 2 байт), либо от 0 до 4 294 967 295 (для 4 байт).В качестве синонима этого типа может использоваться unsigned
  • long: представляет целое число в диапазоне от −2 147 483 648 до 2 147 483 647. Занимает в памяти 4 байта (32 бита).У данного типа также есть синонимы long intsigned long int и signed long
  • unsigned long: представляет целое число в диапазоне от 0 до 4 294 967 295. Занимает в памяти 4 байта (32 бита).Имеет синоним unsigned long int.
  • long long: представляет целое число в диапазоне от −9 223 372 036 854 775 808 до +9 223 372 036 854 775 807. Занимает в памяти, как правило, 8 байт (64 бита).Имеет синонимы long long intsigned long long int и signed long long.
  • unsigned long long: представляет целое число в диапазоне от 0 до 18 446 744 073 709 551 615. Занимает в памяти, как правило, 8 байт (64 бита).Имеет синоним unsigned long long int.
  • float: представляет вещественное число ординарной точности с плавающей точкой в диапазоне +/- 3.4E-38 до 3.4E+38. В памяти занимает 4 байта (32 бита)
  • double: представляет вещественное число двойной точности с плавающей точкой в диапазоне +/- 1.7E-308 до 1.7E+308. В памяти занимает 8 байт (64 бита)
  • long double: представляет вещественное число двойной точности с плавающей точкой не менее 8 байт (64 бит). В зависимости от размера занимаемой памяти может отличаться диапазон допустимых значений.
  • void: тип без значенияТакже иногда используются типы данных uint8_t / uint16 и тд.Для создания переменной используется следующий синтаксис:
    тип «название» = значение;
    можно инициализировать однотипные переменные через запятую (в некоторых IDE через =)Если у вас нет значения для переменной — то лучше присваивать ей 0.
    Пример создания переменных приведен ниже.

    //________________________________
    К типам данных нужно быть крайне внимательным иначе можно получить ошибки и некоторые из них трудно отследить, например:

        unsigned short a1=65500, b1=10, c1=1000;
    
        unsigned short result_1=a1+b1;
        unsigned short result_2=a1+c1;
    
        cout<<"result_1= \t"<<result_1<<endl; //выводим информацию в консоль
        cout<<"result_2= \t"<<result_2<<endl; //выводим информацию в консоль
    

    При выполнении этого кода result_1 посчитается правильно и примет значение 65500+10=65510, но при вычислении result_2 будет ошибка, т.к. 65500+1000=66500
    а тип данных unsigned short может хранить информацию 0-65535
    В результате при вычислении rezult_2 будет переполнение переменной и получится значение 66500-65535-1=964. (-1 т.к. переполнение и сброс в 0)

    Думаю наглядно видно, что ошибка будет «плавающей» и найти ее может быть нелегко, особенно внутри большого участка кода.
    Также стоит быть внимательными при работе с signed/unsigned переменными, если бы мы rezult сделали signed — он был бы не корректным.

    Также стоит отметить, что приведенный выше код позволяет считать только положительные числа — т.к. использовались без знаковые переменные.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *