Типы данных c и память. Типы данных в языке си

Авто 23.06.2019
Авто

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

Процесс проверки и накладывания ограничений на типы используемых данных называется контролем типов или типизацией программных данных . Различают следующие виды типизации:

  • Статическая типизация - контроль типов осуществляется при компиляции.
  • Динамическая типизация - контроль типов осуществляется во время выполнения.

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

Различают простые, составные и прочие типы данных.

Простые данные

Простые данные можно разделить на

  • целочисленные,
  • вещественные,
  • символьные
  • логические.

Составные (сложные) данные

  • Массив — индексированный набор элементов одного типа.
  • Строковый тип — массив, хранящий строку символов.
  • Структура — набор различных элементов (полей записи), хранимый как единое целое и предусматривающий доступ к отдельным полям структуры.

Другие типы данных

  • Указатель — хранит адрес в памяти компьютера, указывающий на какую-либо информацию, как правило - указатель на переменную.

Программа, написанная на языке Си, оперирует с данными различных типов. Все данные имеют имя и тип. Обращение к данным в программе осуществляется по их именам (идентификаторам).

Идентификатор - это последовательность, содержащая не более 32 символов, среди которых могут быть любые буквы латинского алфавита a — z, A — Z, цифры 0 — 9 и знак подчеркивания (_). Первый символ идентификатора не должен быть цифрой.

Несмотря на то, что допускается имя, имеющее до 32 символов, определяющее значение имеют только первые 8 символов. Помимо имени, все данные имеют тип. Указание типа необходимо для того, чтобы было известно, сколько места в оперативной памяти будет занимать данный объект.

Компилятор языка Си придерживается строгого соответствия прописных и строчных букв в именах идентификаторов и лексем.

Целочисленные данные

Целочисленные данные могут быть представлены в знаковой и беззнаковой форме.

Беззнаковые целые числа представляются в виде последовательности битов в диапазоне от 0 до 2 n -1, где n-количество занимаемых битов.

Знаковые целые числа представляются в диапазоне -2 n-1 …+2 n-1 -1. При этом старший бит данного отводится под знак числа (0 соответствует положительному числу, 1 – отрицательному).

Основные типы и размеры целочисленных данных:

Вещественные данные

Вещественный тип предназначен для представления действительных чисел. Вещественные числа представляются в разрядной сетке машины в нормированной форме.

Нормированная форма числа предполагает наличие одной значащей цифры (не 0) до разделения целой и дробной части. Такое представление умножается на основание системы счисления в соответствующей степени. Например, число 12345,678 в нормированной форме можно представить как

12345,678 = 1,2345678·10 4

Число 0,009876 в нормированной форме можно представить как

0,009876 = 9,876·10 -3

В двоичной системе счисления значащий разряд, стоящий перед разделителем целой и дробной части, может быть равен только 1. В случае если число нельзя представить в нормированной форме (например, число 0), значащий разряд перед разделителем целой и дробной части равен 0.

Значащие разряды числа, стоящие в нормированной форме после разделителя целой и дробной части, называются мантиссой числа .

В общем случае вещественное число в разрядной сетке вычислительной машины можно представить в виде 4 полей.

  • знак — бит, определяющий знак вещественного числа (0 для положительных чисел, 1 — для отрицательных).
  • степень — определяет степень 2, на которую требуется умножить число в нормированной форме. Поскольку степень 2 для числа в нормированной форме может быть как положительной, так и отрицательной, нулевой степени 2 в представлении вещественного числа соответствует величина сдвига, которая определяется как

    где n — количество разрядов, отводимых для представления степени числа.

  • целое — бит, который для нормированных чисел всегда равен 1, поэтому в некоторых представлениях типов этот бит опущен и принимается равным 1.
  • мантисса — значащие разряды представления числа, стоящие после разделителя целой и дробной части в нормированной форме.

Различают три основных типа представления вещественных чисел в языке Си:

Как видно из таблицы, бит целое у типов float и double отсутствует. При этом диапазон представления вещественного числа состоит из двух диапазонов, расположенных симметрично относительно нуля. Например, диапазон представления чисел типа float можно представить в виде:

Пример : представить число -178,125 в 32-разрядной сетке (тип float ).

Для представления числа в двоичной системе счисления преобразуем отдельно целую и дробную части:

178 10 = 10110010 2 .

0,125 10 = 0,001 2 .

178,125 10 = 10110010,001 2 =1,0110010001·2 111

Для преобразования в нормированную форму осуществляется сдвиг на 7 разрядов влево).

Для определения степени числа применяем сдвиг:

0111111+00000111 = 10000110 .

Таким образом, число -178,125 представится в разрядной сетке как

Символьный тип

Символьный тип хранит код символа и используется для отображения символов в различных кодировках. Символьные данные задаются в кодах и по сути представляют собой целочисленные значения. Для хранения кодов символов в языке Си используется тип char .

Логический тип

Логический тип имеет применяется в логических операциях, используется при алгоритмических проверках условий и в циклах и имеет два значения:

  • истина — true
  • ложь — — false

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

Пример объявления объектов

int n; // Переменная n целого типа
double a; // Переменная a вещественного типа двойной точности


Всем хорошо известно, что складывать и вычитать можно только однотипные величины. Например, яблоки можно суммировать с яблоками, но яблоки нельзя суммировать с квадратными метрами или с температурой. Аналогичные ограничения есть и в большинстве современных алгоритмических языков.

Подобно тому, как обычные объекты имеют типы характеристик цвета (красный, синий, жёлтый, зелёный), вкуса (горький, кислый, сладкий), количества (полтора, два, семь), в языке программирования MQL4 данные различаются по типу. Говоря о типе данных, мы будем иметь в виду тип значения константы, переменной и значения, возвращаемого функцией (понятие функции рассматривается в разделе Функции).

В языке MQL4 различают следующие типы (констант, переменных и значений, возвращаемых функциями):

Тип int

Значения типа int - это целые числа. К этому типу относятся значения, которые являются целыми по своей сути. Примерами целых чисел могут служить: количество баров в окне финансового инструмента (16000 баров), количество открытых и отложенных ордеров (3 ордера), дистанция в пунктах от текущего курса финансового инструмента до цены открытия ордера (15 пунктов). Количество таких объектов, как события, также бывают только целыми. Например, количество попыток открыть ордер не может быть равным полутора, а только одной, двум, трём и т.д.

Различают 2 вида целых значений:

  • Десятичные значения могут состоять из цифр 0 - 9 и быть положительными или отрицательными: 10, 11, 12, 1, 5, -379, 25, -12345, -1, 2.
  • Шестнадцатеричные значения могут состоять из букв латинского алфавита от A до F или от a до f, цифр от 0 до 9, обязательно должны начинаться с 0x или 0X и принимать положительные и отрицательные значения: 0x1a7b, 0xff340, 0xAC3 0X2DF23, 0X13AAB, 0X1.

Значения типа int должны находиться в диапазоне чисел от -2 147 483 648 до 2 147 483 647. Если значение константы или переменной находится за пределами указанного диапазона, то результат работы программы будет не определён. В памяти компьютера значения констант и переменных типа int занимают 4 байта.

Пример использования в программе переменной типа int:

int Art = 10 ; // Пример целой переменной
int B_27 = - 1 ; // Пример целой переменной
int Num = 21 ; // Пример целой переменной
int Max = 2147483647 ; // Пример целой переменной
int Min = - 2147483648 ; // Пример целой переменной

Тип double

Значения типа double - это действительные числа, содержащие дробную часть.

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

Иногда при составлении программ могут возникнуть трудности с определением типа переменной, т.е программисту бывает не сразу понятно, к какому типу (int или double) относится переменная. Рассмотрим небольшой пример:

Программа открыла в течение недели 12 ордеров. Какого типа должна быть переменная А, учитывающая среднее количество ордеров, открываемых этой программой в день? Очевидно, что ответ: A = 12 ордеров / 5 дней. То есть, переменная А = 2.4 должна учитываться в программе, как double, т.к. у этого значения есть дробная часть. А какого типа должна быть эта же переменная А в случае, если общее количество открытых за неделю ордеров составляет 10? Казалось бы, что если 2 (10 ордеров / 5 дней = 2) не имеет дробной части, то переменная А может учитываться как int. Однако это рассуждение ошибочно. Текущее значение некоторой переменной может иметь дробную часть, состоящую из одних нулей. Но важно то, что значение этой переменной является действительным по своей сути. В этом случае переменная А также должна иметь тип double, и при записи константы в программе обязательно отображается разделяющая точка: А = 2.0


Значения действительных констант и переменных состоят из целой части, десятичной точки (.) и дробной части. Они могут принимать положительные и отрицательные значения. Целая и дробная части составляются из цифр 0 - 9. Количество значащих цифр после десятичной точки может достигать 15. Например:

27.12 -1.0 2.5001 -765456.0 198732.07 0.123456789012345

Интервал значений типа double находится в пределах от -1.7 * e-308 до 1.7 * e308. В памяти компьютера значения констант и переменных типа double занимают 8 байт.

Пример использования в программе переменной типа double:

double Art = 10.123 ;
double B_27 = - 1.0 ; // Пример действительной переменной
double Num = 0.5 ; // Пример действительной переменной
double MMM = - 12.07 ; // Пример действительной переменной
double Price_1 = 1.2756 ; // Пример действительной переменной

Тип bool

Значения типа bool - это значения логического типа, содержанием которых являются ложь и истина.

Для того чтобы лучше усвоить смысл понятия логический тип, рассмотрим небольшой пример из обыденной жизни. Предположим, что у учителя возникла необходимость вести учёт наличия учебников у учеников. В этом случае учитель составит на листе бумаги список учеников и справа в строке будет делать пометки о том, есть у ученика учебник или нет. Например, он может ставить галочку и прочерк:

Список учеников Учебник физики Учебник биологии Учебник химии
1 Иванов V - -
2 Петров V - V
3 Сидоров - V V
... ... ... ... ...
25 Миронов V V V

Значения в правых столбцах будут принимать только 2 возможных значения: верно или неверно. Эти значения нельзя отнести к ранее рассмотренным типам данных, поскольку они не являются числами. Они также не являются значениями цвета, вкуса, количества и т.д. Тем не менее, они несут важную смысловую нагрузку. В языке MQL4 подобные значения называют логическими. Характеристикой констант и переменных типа bool является то, что они могут принимать лишь 2 возможных значения - истина (true, True, TRUE, 1) или ложь (false, False, FALSE, 0). В памяти компьютера значения констант и переменных типа bool занимают 4 байта.

Пример использования в программе переменной типа bool:

bool aa = True ; // Логическая переменная аа имеет значение истина
bool B17 = TRUE ; // Логическая переменная B17 имеет значение истина
bool Hamma = 1 ; // Логическая переменная Hamma имеет значение истина

bool Asd = False ; // Логическая переменная Asd имеет значение ложь
bool Nol = FALSE ; // Логическая переменная Nol имеет значение ложь
bool Prim = 0 ; // Логическая переменная Prim имеет значение ложь

Тип string

Значение типа string - это значение строкового типа, представляющее собой набор символов кода ASCII.

В обычной жизни аналогичное содержание имеют названия, например, магазинов, марок автомобилей и пр. Значение строкового типа записывается в виде набора символов, заключённого в двойные кавычки (не путать двойные кавычки с двумя одинарными!). Кавычки используются только для того, чтобы обозначить начало и окончание значения строковой константы, а собственно значением является совокупность символов, обрамлённая кавычками.

Если необходимо ввести в строку двойную кавычку ", то перед ней надо поставить символ обратной косой черты: \. В строку могут быть введены любые специальные символьные константы, перед которыми стоит символ обратной косой черты \. Длина строковой константы - от 0 до 255 символов. Если длина строковой константы превосходит максимальную, лишние символы справа отбрасываются, и компилятор выдаёт соответствующее предупреждение. Сочетание из двух символов, первый из которых – обратная косая черта \, обычно является общепринятым и воспринимается большинством программ как указание на выполнение определённого форматирования текста. В тексте это сочетание не отображается. Например, сочетание \n указывает на необходимость переноса строки, \t указывает на табуляцию и т.д.

Значение строкового типа записывается в виде набора символов, заключённого в двойные кавычки: "MetaTrader 4", " Stop Loss", "Ssssstop_Loss", "stoploss", "10 pips". Собственно строковым значением является набор символов, находящийся внутри кавычек. Кавычки используются лишь для обозначения границ значения. Внутреннее представление - структура размером в 8 байт.

Пример использования в программе переменной типа string:

string Prefix = " MetaTrader 4 ";
string Postfix = " _of_my_progr . OK "; // Пример строковой переменной
string Name_Mass = " History "; // Пример строковой переменной
string text ="Верхняя строка\ n Нижняя строка"; // текст содержит символы перевода строки

Тип color

Значение типа color - это значение цветового типа.

Всем хорошо известно, что значит цвет: синий, красный, белый, желтый, зелёный. Нетрудно представить, что означает переменная или константа цветового типа. Это такая константа или переменная, значением которой является цвет. Это может показаться несколько непривычным, но в сущности – очень просто. Подобно тому, как значением целой константы является число, значением цветовой константы является цвет.

Значения цветовых констант и переменных могут быть представлены одним из трёх видов:

  • Литералы

    Значение цветового типа в виде литерала состоит из трёх частей, представляющих собой числовые значения интенсивности трех основных компонент цвета: красного, зеленого и синего. Значение такого вида начинается с символа C и обрамляется одинарными кавычками.

    Числовые значения интенсивности компоненты цвета лежат в диапазоне от 0 до 255 и могут записываться как в десятичном, так и в шестнадцатеричном виде.

    Примеры: C"128,128,128" (серый), C"0x00,0x00,0xFF" (синий), C"0xFF,0x33,0x00" (красный).

  • Целочисленное представление

    Целочисленное представление записывается в виде шестнадцатеричного или десятичного числа. Шестнадцатеричное число имеет вид 0xRRGGBB, где RR - значение интенсивности красной компоненты цвета, GG - зелёной, а BB - синей. Десятичные константы не имеют прямого отражения в RGB. Они представляют собой десятичное значение шестнадцатеричного целочисленного представления.

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

    Примеры: 0xFFFFFF (белый), 0x008000 (зеленый), 16777215 (белый), 32768 (зеленый).


    Рис. 11. В современных редакторах можно взять параметры цвета для литерального и целочисленного представления цветового значения константы.

  • Названия цветов

    Самым простым способом задания цвета является указание его названия в соответствии с таблицей Web-цветов. В этом случае значение цвета представляется словом, поставленным в соответствие цвету, например, Red - красный.

    Black DarkGreen DarkSlateGray Olive Green Teal Navy Purple
    Maroon Indigo MidnightBlue DarkBlue DarkOliveGreen SaddleBrown ForestGreen OliveDrab
    SeaGreen DarkGoldenrod DarkSlateBlue Sienna MediumBlue Brown DarkTurquoise DimGray
    LightSeaGreen DarkViolet FireBrick MediumVioletRed MediumSeaGreen Chocolate Crimson SteelBlue
    Goldenrod MediumSpringGreen LawnGreen CadetBlue DarkOrchid YellowGreen LimeGreen OrangeRed
    DarkOrange Orange Gold Yellow Chartreuse Lime SpringGreen Aqua
    DeepSkyBlue Blue Magenta Red Gray SlateGray Peru BlueViolet
    LightSlateGray DeepPink MediumTurquoise DodgerBlue Turquoise RoyalBlue SlateBlue DarkKhaki
    IndianRed MediumOrchid GreenYellow MediumAquamarine DarkSeaGreen Tomato RosyBrown Orchid
    MediumPurple PaleVioletRed Coral CornflowerBlue DarkGray SandyBrown MediumSlateBlue Tan
    DarkSalmon BurlyWood HotPink Salmon Violet LightCoral SkyBlue LightSalmon
    Plum Khaki LightGreen Aquamarine Silver LightSkyBlue LightSteelBlue LightBlue
    PaleGreen Thistle PowderBlue PaleGoldenrod PaleTurquoise LightGray Wheat NavajoWhite
    Moccasin LightPink Gainsboro PeachPuff Pink Bisque LightGoldenrod BlanchedAlmond
    LemonChiffon Beige AntiqueWhite PapayaWhip Cornsilk LightYellow LightCyan Linen
    Lavender MistyRose OldLace WhiteSmoke Seashell Ivory Honeydew AliceBlue
    LavenderBlush MintCream Snow White



В памяти компьютера значения констант и переменных типа color занимают 4 байта. Пример использования такой переменной в программе:

color Paint_1 = C " 128 , 128 , 128 "; // Переменной присвоено значение серого цвета
color Colo = C " 0 x00 , 0 x00 , 0 xFF "; // Переменной присвоено значение синего цвета
color BMP_4 = C " 0 xFF , 0 x33 , 0 x00 "

color K_12 = 0 xFF3300 ; // Переменной присвоено значение красного цвета
color N_3 = 0 x008000 ;
color Color = 16777215 ;
color Alfa = 32768 ; // Переменной присвоено значение зелёного цвета

color A = Red ; // Переменной присвоено значение красного цвета
color B = Yellow ; // Переменной присвоено значение желтого цвета
color Colorit = Black ; // Переменной присвоено значение черного цвета
color B_21 = White ; // Переменной присвоено значение белого цвета

Тип datetime

Значение типа datetime - это значение даты и времени.

Значения этого типа могут использоваться в программах для анализа момента начала или окончания каких-либо событий, в том числе выхода важных новостей, начала/конца рабочего дня и пр. Константы даты и времени могут быть представлены в виде литеральной строки, которая состоит из 6 частей, представляющих числовое значение года, месяца, даты (либо даты, месяца, года), часа, минуты и секунды.

Константа обрамляется одинарными кавычками и начинается с символа D. Допускается использование усечённого значения: либо без даты, либо без времени, либо пустое значение. Диапазон изменения значений: от 1 января 1970 года до 31 декабря 2037 года. В памяти компьютера значения констант и переменных типа datetime занимают 4 байта. Значение представляет собой количество секунд, прошедших с 00:00 1 января 1970 года.

Пример использования в программе переменной типа datetime:

datetime Alfa = D " 2004.01.01 00 : 00 "; // Новый Год
datetime Tim = D " 01.01.2004 "; // Новый Год
datetime Tims = D " 2005.05.12 16 : 30 : 45 ";
datetime N_3 = D " 12.05.2005 16 : 30 : 45 "; // 12 мая 2005г. 16 час.30 мин.45 сек.
datetime Compile = D ""; // равнозначно D"[дата компиляции] 00:00:00"

Объявление и инициализация переменных

Для того чтобы в ходе вычислений у программы не возникало вопросов, к какому типу данных принадлежит та или иная переменная, в MQL4 принято обязательное правило явно обозначать тип переменных в самом начале программы. Прежде чем переменная начнёт участвовать в каких-либо вычислениях, её необходимо объявить.

Объявление переменной - это первое упоминание переменной в программе. При объявлении переменной указывается её тип.

Инициализация переменной - это присвоение ей при её объявлении значения, соответствующего её типу. Любая переменная может быть инициализирована. Если явно не задано никакое начальное значение, то численная переменная инициализируется нулем (0), а переменная строкового типа инициализируется пустой строкой.

Объявление переменной может осуществляться в отдельной строке:

int Var_1 ; // Объявление переменной в отдельной строке

Эта запись означает, что будет использоваться переменная Var_1 (собственно объявление переменной) и тип этой переменной - int.

Допускается объявление в одной строке нескольких переменных одного типа:

int Var_1 , Box , Comm ; // Объявление нескольких переменных в одной строке

Эта запись означает, что будут использоваться переменные Var_1, Box и Comm и тип этих переменных - int, то есть перечисленные переменные будут учтены программой как переменные целого типа.


Допускается инициализация переменных в рамках операторов:

double Var_5 = 3.7 ; // Инициализация переменной в операторе присваивания

Эта запись означает, что будет использоваться переменная Var_5 вещественного типа с начальным значением 3.7.

Нигде в последующих строках программы тип переменных не указывается. Однако всякий раз, обращаясь к переменной, программа будет помнить, что эта переменная того типа, который указан при её объявлении. По ходу вычислений в программе значения переменных могут меняться, но тип переменных не изменяется.

Название переменной никак не связано с типом переменной, т.е. по названию переменной невозможно судить о её типе. Одно и то же название переменной в разных программах может быть использовано для переменных любого типа. Но в пределах одной программы тип любой переменной может быть объявлен только один раз. В ходе выполнения программы тип объявленной переменной не изменяется.

Примеры объявления и инициализации переменных

Объявление переменных может осуществляться в нескольких строках или в одной строке.

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



Рис. 12. Примеры объявления переменных в отдельной строке.


Объявление типа переменных производится один раз при первом упоминании переменной. При втором и последующих упоминаниях переменной её тип не указывается.



Рис. 13. Примеры объявления переменных в отдельной строке.


Допускаются объявление и инициализация переменных в операторах.



Рис. 14. Примеры инициализации переменных.



Рис. 15. Инициализация переменной в заголовке составного оператора.

Типы данных

Типы данных имеют особенное значение в C#, поскольку это строго типизированный язык. Это означает, что все операции подвергаются строгому контролю со стороны компилятора на соответствие типов, причем недопустимые операции не компилируются. Следовательно, строгий контроль типов позволяет исключить ошибки и повысить надежность программ. Для обеспечения контроля типов все переменные, выражения и значения должны принадлежать к определенному типу. Такого понятия, как "бестиповая" переменная, в данном языке программирования вообще не существует. Более того, тип значения определяет те операции, которые разрешается выполнять над ним. Операция, разрешенная для одного типа данных, может оказаться недопустимой для другого.

В C# имеются две общие категории встроенных типов данных: типы значений и ссылочные типы . Они отличаются по содержимому переменной. Концептуально разница между ними состоит в том, что тип значения (value type) хранит данные непосредственно, в то время как ссылочный тип (reference type) хранит ссылку на значение.

Эти типы сохраняются в разных местах памяти: типы значений сохраняются в области, известной как стек , а ссылочные типы - в области, называемой управляемой кучей .

Давайте разберем типы значений.

Целочисленные типы

В C# определены девять целочисленных типов: char, byte, sbyte, short, ushort, int, uint, long и ulong . Но тип char применяется, главным образом, для представления символов и поэтому рассматривается отдельно. Остальные восемь целочисленных типов предназначены для числовых расчетов. Ниже представлены их диапазон представления чисел и разрядность в битах:

Целочисленные типы C#
Тип Тип CTS Разрядность в битах Диапазон
byte System.Byte 8 0:255
sbyte System.SByte 8 -128:127
short System.Int16 16 -32768: 32767
ushort System.UInt16 16 0: 65535
int System.Int32 32 -2147483648: 2147483647
uint System.UInt32 32 0: 4294967295
long System.Int64 64 -9223372036854775808: 9223372036854775807
ulong System.UInt64 64 0: 18446744073709551615

Как следует из приведенной выше таблицы, в C# определены оба варианта различных целочисленных типов: со знаком и без знака. Целочисленные типы со знаком отличаются от аналогичных типов без знака способом интерпретации старшего разряда целого числа. Так, если в программе указано целочисленное значение со знаком, то компилятор C# сгенерирует код, в котором старший разряд целого числа используется в качестве флага знака. Число считается положительным, если флаг знака равен 0, и отрицательным, если он равен 1.

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

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

Так, если значение нужно сохранить без знака, то для него можно выбрать тип uint , для больших значений со знаком - тип long , а для больших значений без знака - тип ulong . В качестве примера ниже приведена программа, вычисляющая расстояние от Земли до Солнца в сантиметрах. Для хранения столь большого значения в ней используется переменная типа long:

Using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string args) { long result; const long km = 149800000; // расстояние в км. result = km * 1000 * 100; Console.WriteLine(result); Console.ReadLine(); } } }

Всем целочисленным переменным значения могут присваиваться в десятичной или шестнадцатеричной системе обозначений. В последнем случае требуется префикс 0x:

Long x = 0x12ab;

Если возникает какая-то неопределенность относительно того, имеет ли целое значение тип int, uint, long или ulong, то по умолчанию принимается int. Чтобы явно специфицировать, какой другой целочисленный тип должно иметь значение, к числу можно добавлять следующие символы:

Uint ui = 1234U; long l = 1234L; ulong ul = 1234UL;

U и L можно также указывать в нижнем регистре, хотя строчную L легко зрительно спутать с цифрой 1 (единица).

Типы с плавающей точкой

Типы с плавающей точкой позволяют представлять числа с дробной частью. В C# имеются две разновидности типов данных с плавающей точкой: float и double . Они представляют числовые значения с одинарной и двойной точностью соответственно. Так, разрядность типа float составляет 32 бита, что приближенно соответствует диапазону представления чисел от 5E-45 до 3,4E+38. А разрядность типа double составляет 64 бита, что приближенно соответствует диапазону представления чисел от 5E-324 до 1,7Е+308.

Тип данных float предназначен для меньших значений с плавающей точкой, для которых требуется меньшая точность. Тип данных double больше, чем float, и предлагает более высокую степень точности (15 разрядов).

Если нецелочисленное значение жестко кодируется в исходном тексте (например, 12.3), то обычно компилятор предполагает, что подразумевается значение типа double. Если значение необходимо специфицировать как float, потребуется добавить к нему символ F (или f):

Float f = 12.3F;

Десятичный тип данных

Для представления чисел с плавающей точкой высокой точности предусмотрен также десятичный тип decimal , который предназначен для применения в финансовых расчетах. Этот тип имеет разрядность 128 бит для представления числовых значений в пределах от 1Е-28 до 7,9Е+28. Вам, вероятно, известно, что для обычных арифметических вычислений с плавающей точкой характерны ошибки округления десятичных значений. Эти ошибки исключаются при использовании типа decimal, который позволяет представить числа с точностью до 28 (а иногда и 29) десятичных разрядов. Благодаря тому что этот тип данных способен представлять десятичные значения без ошибок округления, он особенно удобен для расчетов, связанных с финансами:

Using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string args) { // *** Расчет стоимости капиталовложения с *** // *** фиксированной нормой прибыли*** decimal money, percent; int i; const byte years = 15; money = 1000.0m; percent = 0.045m; for (i = 1; i

Результатом работы данной программы будет:

Символы

В C# символы представлены не 8-разрядным кодом, как во многих других языках программирования, например С++ , а 16-разрядным кодом, который называется юникодом (Unicode) . В юникоде набор символов представлен настолько широко, что он охватывает символы практически из всех естественных языков на свете. Если для многих естественных языков, в том числе английского, французского и немецкого, характерны относительно небольшие алфавиты, то в ряде других языков, например китайском, употребляются довольно обширные наборы символов, которые нельзя представить 8-разрядным кодом. Для преодоления этого ограничения в C# определен тип char , представляющий 16-разрядные значения без знака в пределах от 0 до 65 535. При этом стандартный набор символов в 8-разрядном коде ASCII является подмножеством юникода в пределах от 0 до 127. Следовательно, символы в коде ASCII по-прежнему остаются действительными в C#.

Целый тип (int)

Размер типа int не определяется стандартом, а зависит от компьютера и компилятора.

Для 16-разрядного процессора под величины этого типа отводится 2 байта,

для 32-разрядного - 4 байта.

Спецификатор short перед именем типа указывает компилятору, что под число требуется отвести 2 байта независимо от разрядности процессора.

Спецификатор long означает, что целая величина будет занимать 4 байта.

Таким образом, на 16-разрядном компьютере эквиваленты int и short int,

а на 32-разрядном - int и long int.

Внутреннее представление величины целого типа - целое число в двоичном коде. При использовании спецификатора signed старший бит числа интерпретируется как знаковый (0 - положительное число, 1 - отрицательное). Спецификатор unsigned позволяет представлять только положительные числа, поскольку старший разряд рассматривается как часть кода числа. Т. о., диапазон значений типа int зависит от спецификаторов. Диапазоны значений величин целого типа с различными спецификаторами для IBM PC-совместимых компьютеров приведены в таблице «Диапазоны значений простых типов данных».

По умолчанию все целочисленные типы считаются знаковыми, то есть спецификатор signed можно опускать.

Константам, встречающимся в программе, приписывается тот или иной тип в соответствии с их видом. Если он по каким-либо причинам не устраивает программиста, моно явно указать требуемый тип с помощью суффиксов L, l (long) и U, u (unsigned). Например, константа 32L будет иметь тип long и занимать 4 байта. Можно использовать суффиксы L и U одновременно, например, 0x22UL или 05Lu.

Примечание. Типы short int, long int, signed int и unsigned int можно сокращать до short, long, signed и unsigned соответственно.

Символьный тип (char)

Под величину символьного типа отводится количество байт, достаточное для размещения любого символа из набора символов для данного компьютера, что и обусловило название типа. Как правило, это 1 байт. Тип char, как и другие целые типы, может быть со знаком или без знака. В величинах со знаком можно хранить значения в диапазоне от -128 до 127. При использовании спецификатора unsigned значения могут находиться в пределах от 0 до 255. Этого достаточно для хранения любого символа из 256-символьного набора ASCII. Величины типа char применяются также для хранения целых чисел.



Расширенный символьный тип (wchar_t)

Тип wchar_t предназначен для работы с набором символов, для кодировки которых недостаточно 1 байта. Например, Unicode. Размер этого типа зависит от реализации; как правило, он соответствует типу short. Строковые константы типа wchar_t записываются с префиксом L, например, L“Gates”.

Логический тип (bool)

Величины логического типа могут принимать только значения true и false , являющиеся зарезервированными словами. Внутренняя форма представления значения false - 0 (нуль). Любое другое значение интерпретируется как true. При преобразовании к целому типу true имеет значение 1.

Типы с плавающей точкой (float, double и long double)

Стандарт C++ определяет три типа данных для хранения вещественных значений: float, double и long double.

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

В IBM PC-совместимых компьютерах величины типа float занимают 4 байта, из которых один двоичный разряд отводится под знак мантиссы , 8 разрядов под порядок и 23 под мантиссу . Мантисса - это число, большее 1.0, но меньшее 2.0. Поскольку старшая цифра мантиссы всегда равна 1, она не хранится.

Для величин типа double, занимающих 8 байт, под порядок и мантиссу отводится 11 и 52 разряда соответственно. Длина мантиссы определяет точность числа, а длина порядка - его диапазон. Как можно видеть из таблицы в конце записи, при одинаковом количестве байт, отводимом под величины типа float и long int, диапазоны их допустимых значений сильно различаются из-за внутренней формы представления .

Спецификатор long перед именем типа double указывает, что под его величину отводится 10 байт.

Константы с плавающей точкой имеют по умолчанию тип double. Можно явно указать тип константы с помощью суффиксов F, f (float) и L, l (long).

Например, константа 2E+6L будет иметь тип long double, а константа 1.82f - тип float.

При написании универсальных для разных платформ программ нельзя делать допущений о размере типа int. Для его получения необходимо пользоваться операцией sizeof, результатом которой является размер типа в байтах.

Например, для операционной системы MS-DOS sizeof (int) даст в результате 2, а для Windows 98 или OS/2 результатом будет 4.

В стандарте ANSI диапазоны значений для основных типов не задаются, определяются только соотношения между их размерами, например:

sizeof(float) ≤ slzeof(double) ≤ sizeof(long double)
sizeof(char) ≤ slzeof(short) ≤ sizeof(int) ≤ sizeof(long)

Примечание. Минимальные и максимальные допустимые значения для целых типов зависят от реализации и приведены в заголовочном файле (), характеристики вещественных типов - в файле (), а также в шаблоне класса numeric_limits

Тип void

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

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

Тип Диапазон значений Размер (байт)
bool true и false
signed char -128 … 127
unsigned char 0 … 255
signed short int -32 768 … 32 767
unsigned short int 0 … 65 535
signed long int -2 147 483 648 … 2 147 483 647
unsigned long int 0 … 4 294 967 295
float 3.4e-38 … 3.4e+38
double 1.7e-308 … 1.7C+308
long double 3.4e-4932 … 3.4e+4932

Структура программы

Программа на языке С++ состоит из функций , описаний и директив препроцессора . Одна из функций должна иметь имя main . Выполнение программы начинается с первого оператора этой функции. Простейшее определение функции имеет следующий формат:

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

  • если функция не должна возвращать значение, указывается тип void:
  • тело функции является блоком и, следовательно, заключается в фигурные скобки;
  • функции не могут быть вложенными;
  • каждый оператор заканчивается точкой с запятой (кроме составного оператора).

Пример структуры программы, содержащей функции main, fl и f2:

Программа может состоять из нескольких модулей (исходных файлов).

Замечания о вводе/выводе в C++

В языке С++ нет встроенных средств ввода/вывода - он осуществляется с помощью функций, типов и объектов, содержащихся в стандартных библиотеках.

Используется два способа: функции, унаследованные из языка С, и объекты С++.

Основные функции ввода/вывода в стиле С:

int scanf (const char* format, ...) // ввод
int printf(const char* format, ...) // вывод

Они выполняют форматированный ввод и вывод произвольного количества величин в соответствии со строкой формата format. Строка формата содержит символы, которые при выводе копируются в поток (на экран) или запрашиваются из потока (с клавиатуры) при вводе, и спецификации преобразования, начинающиеся со знака %, которые при вводе и выводе заменяются конкретными величинами.

Пример программы, использующей функции ввода/вывода в стиле С:

#include
int main() {
int i;
printf("Введите целое число\п");
scanf("%d", &i);
printf("Вы ввели число %d, спасибо!", i);
return 0;
}

Первая строка этой программы - директива препроцессора, по которой в текст программы вставляется заголовочный файл, содержащий описание использованных в программе функций ввода/вывода (в данном случае угловые скобки являются элементом языка). Все директивы препроцессора начинаются со знака #.

Третья строка - описание переменной целого типа с именем i.

Функция printf в четвертой строке выводит приглашение «Введите целое число» и переходит на новую строку в соответствии с управляющей последовательностью \n. Функция scanf заносит введенное с клавиатуры целое число в переменную i (знак & означает операцию получения адреса), а следующий оператор выводит на экран указанную в нем строку, заменив спецификацию преобразования на значение этого числа.

Программа с использованием библиотеки классов С++:

#include
int main() {
int i;
cout << "Введите целое число\n "; cin >> i;
cout << "Вы ввели число " << i << ", спасибо!";
return 0;
}

Заголовочный файл содержит описание набора классов для управления вводом/выводом. В нем определены стандартные объекты-потоки cin для ввода с клавиатуры и cout для вывода на экран, а также операции помещения в поток < < и чтения из потока >>.

Можно использовать оба способа организации ввода\вывода, но в одной программе смешивать их не рекомендуется.



Рекомендуем почитать

Наверх