> For the complete documentation index, see [llms.txt](https://lessons.sannybuilder.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lessons.sannybuilder.com/00300/00100/000103.-tipy-dannykh-v-c-.-bazovye-operacii-nad-nimi..md).

# 000103. Типы данных в C#. Базовые операции над ними.

Типы данных в C#. Базовые операции над ними.|В этом уроке Вы узнаете о базовых типах данных в C#, которые справедливы и для скриптинга GTA IV.|wmysterio|wmysterio||||Как вчера помню, как писал урок о типах данных в SannyBuilder и вот уже добрался и к GTA 4 :) Если в саннике типов данных было так мало, что на пальцах посчитать можно, то в C# их просто огромное количество! Большинство из них я сам не знаю, поэтому рассмотрим то, что чаще встречаются.

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

| Тип           | Синоним | Размер ( в байтах ) | Диапазон значений                           |
| ------------- | ------- | ------------------- | ------------------------------------------- |
| System.Byte   | byte    | 1                   | \[0;255]                                    |
| System.SByte  | sbyte   | 1                   | \[-128;127]                                 |
| System.Int16  | short   | 2                   | \[-32768;32767]                             |
| System.UInt16 | ushort  | 2                   | \[0;65535]                                  |
| System.Int32  | int     | 4                   | \[-2147483648;2147483647]                   |
| System.UInt32 | uint    | 4                   | \[0;4294967295]                             |
| System.Int64  | long    | 8                   | \[-9223372036854775808;9223372036854775807] |
| System.UInt64 | ulong   | 8                   | \[0;18446744073709551615]                   |

Дальше пойдут дробные числа. Есть, как минимум три, часто использующихся типа:

| Тип            | Синоним | Размер ( в байтах ) | Диапазон значений  |
| -------------- | ------- | ------------------- | ------------------ |
| System.Single  | float   | 4                   | \[5E-45;3.4E+38]   |
| System.Double  | double  | 8                   | \[5E-324;1.7Е+308] |
| System.Decimal | decimal | 16                  | \[1Е-28;7.9Е+28]   |

Также в C# мы можем хранить как отдельный символ в переменной, так и целую строку. Для этого существуют следующие типы:

| Тип           | Синоним | Размер ( в байтах )                 | Диапазон значений | Форма записи |
| ------------- | ------- | ----------------------------------- | ----------------- | ------------ |
| System.Char   | char    | 2                                   | \[0;65535]        | 'D'          |
| System.String | string  | 4-8 в зависимости от разрядности ОС | -                 | "my string"  |

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

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

Есть ещё очень важный простый логический тип, который чаще всего используется для хранение состояний ( истина / ложь ), а также как выражение для проверки условий:

| Тип            | Синоним | Размер ( в байтах ) | Форма записи   |
| -------------- | ------- | ------------------- | -------------- |
| System.Boolean | bool    | 1                   | true или false |

Здесь важно отметить, что в C# не определено взаимное преобразование логических и целых значений. Например, 1 не преобразуется в значение true, а 0 - в значение false. И на оборот. На этот крючок часто попадаются люди, которые переходят с C/C++, где такое преобразование допускалось, и из за этого возникают некоторые проблемы.

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

<table><thead><tr><th>Объявление в столбик</th><th>Объявление в одну строку</th><th>Объявление и присвоение значения переменным</th></tr></thead><tbody><tr><td><p>```</p><p>cs int a; int b; int c;</p><pre><code>&#x3C;/td>&#x3C;td>
</code></pre><p>cs int a, b, c;</p><pre><code>&#x3C;/td>&#x3C;td>
</code></pre><p>cs int a = 0; int b, c = 36; int d = -5, c = 20;</p><pre><code>&#x3C;/td>&#x3C;/tr>
&#x3C;/tbody>&#x3C;/table>

\<div class="alert alert-warning alert-dismissible" role="alert">
\<button type="button" class="close" data-dismiss="alert" aria-label="Close">\<span aria-hidden="true">\&times;\</span>\</button>
**Примечание:** Если переменные объявлены таким видом: \<u>int b, c = 36\</u>, то значение \<u>36\</u> будет присвоено только переменной \<u>c\</u>, а не всем переменным. Помните об этом!
\</div>

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

</code></pre><p>cs float x = 20.0; // ошибка float y = 4; // всё ок</p><pre><code>

Во втором случае мы указали число вовсе без плавающей точки и при этом отработало всё на ура. А вот первый вариант никак не поймёт что мы написали. Суть ошибки в том, что по-умолчанию выражение \<u>20.0\</u> относится к типу **double**, у которого нет явного преобразования в тип \<u>float\</u>. Чтобы указать компилятору, что мы хотим использовать именно \<u>float\</u>, нужно дописать суффикс **F** ( регистр может быть любым ):

</code></pre><p>cs float x = 20.0F; // всё ок float y = 4F; // тоже работает</p><pre><code>

На самом деле таких суффиксов достаточно много, но рассматривать их здесь я не буду. Вы уже можете найти их самостоятельно. Ещё одна особенность литералов в способе написания дробных чисел, например: \<u>0.0001F\</u>. C# позволяет нам пропускать первое число до точки, в результате мы можем увидеть и такую запись:

</code></pre><p>cs float x = .0001F;</p><pre><code>

Далее рассмотрим операции над типами, которые существуют в C#. Если в SannyBuilder все операции нумеровались ( опкоды ) и сам скриптовый язык был низкоуровневым, то C# позволяет делать огромное количество операций, комбинируя их.

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

* Арифметические операторы:
  \<table class="table table-bordered">\<tbody>
  \<tr>\<th>Оператор\</th>\<th>Действие\</th>\</tr>
  \<tr>\<td>+\</td>\<td>Сложение\</td>\</tr>
  \<tr>\<td>-\</td>\<td>Вычитание, унарный минус\</td>\</tr>
  \<tr>\<td>\*\</td>\<td>Умножение\</td>\</tr>
  \<tr>\<td>/\</td>\<td>Деление\</td>\</tr>
  \<tr>\<td>%\</td>\<td>Деление по модулю\</td>\</tr>
  \<tr>\<td>--\</td>\<td>Декремент\</td>\</tr>
  \<tr>\<td>++\</td>\<td>Инкремент\</td>\</tr>
  \</tbody>\</table>

* Операторы отношения, ( означает взаимосвязь, которая может существовать между двумя значениями ):
  \<table class="table table-bordered">\<tbody>
  \<tr>\<th>Оператор\</th>\<th>Действие\</th>\</tr>
  \<tr>\<td>==\</td>\<td>Равно\</td>\</tr>
  \<tr>\<td>!=\</td>\<td>Не равно\</td>\</tr>
  \<tr>\<td>>\</td>\<td>Больше\</td>\</tr>
  \<tr>\<td><\</td>\<td>Меньше\</td>\</tr>
  \<tr>\<td>>=\</td>\<td>Больше или равно\</td>\</tr>
  \<tr>\<td><=\</td>\<td>Меньше или равно\</td>\</tr>
  \</tbody>\</table>

* Логические операторы ( взаимосвязь между логическими значениями "истина" и "ложь" ):

\<table class="table table-bordered">\<tbody>
\<tr>\<th>Оператор\</th>\<th>Действие\</th>\</tr>
\<tr>\<td>&\</td>\<td>И\</td>\</tr>
\<tr>\<td>|\</td>\<td>ИЛИ\</td>\</tr>
\<tr>\<td>^\</td>\<td>Исключающее ИЛИ\</td>\</tr>
\<tr>\<td>&&\</td>\<td>Укороченное И\</td>\</tr>
\<tr>\<td>||\</td>\<td>Укороченное ИЛИ\</td>\</tr>
\<tr>\<td>!\</td>\<td>НЕ\</td>\</tr>
\</tbody>\</table>

* Операторы присваивания:
  \<table class="table table-bordered">\<tbody>
  \<tr>\<th>Оператор\</th>\<th>Аналог\</th>\</tr>
  \<tr>\<td>+= \</td>\<td>x = x + 1;\</td>\</tr>
  \<tr>\<td>-= \</td>\<td>x = x - 1;\</td>\</tr>
  \<tr>\<td>\*=\</td>\<td>x = x \* 1;\</td>\</tr>
  \<tr>\<td>/=\</td>\<td>x = x / 1;\</td>\</tr>
  \<tr>\<td>%=\</td>\<td>x = x % 1;\</td>\</tr>
  \<tr>\<td>|=\</td>\<td>x = x | 1;\</td>\</tr>
  \<tr>\<td>^=\</td>\<td>x = x ^ 1;\</td>\</tr>
  \</tbody>\</table>

* Поразрядные операторы:

\<table class="table table-bordered">\<tbody>
\<tr>\<th>Оператор\</th>\<th>Действие\</th>\</tr>
\<tr>\<td>&\</td>\<td>Поразрядное И\</td>\</tr>
\<tr>\<td>|\</td>\<td>Поразрядное ИЛИ\</td>\</tr>
\<tr>\<td>^\</td>\<td>Порязрядное исключающее ИЛИ\</td>\</tr>
\<tr>\<td><<\</td>\<td>Сдвиг влево\</td>\</tr>
\<tr>\<td>>>\</td>\<td>Сдвиг вправо\</td>\</tr>
\<tr>\<td>\~\</td>\<td>Дополнение до 1 ( унарный оператор НЕ )\</td>\</tr>
\</tbody>\</table>

Как мы видим, некоторые операторы могут использоваться в разных целях, в зависимости где их применяют. В одном случае он может быть логическим - в другом: поразрядным. В любом случае, для написания скриптов для GTA IV большинство операторов будет не нужно.

Примеров может быть уйма, я написал самый простой:

</code></pre><p>cs int a; a = (25 + 65)\*2; a /= 5;</p><pre><code>

Объявляем переменную типа int. Дальше идут операции над ней. Проблемы, думаю, могут возникнут у того, кто не дружил с математикой в детстве(или сейчас).

Язык C# действует по тому же принципу, что и математика. Сначала выбирается приоритет выполнения операций. В нашем случаи сначала будут выполнятся операции в скобках: 25+65=90. Дальше идёт умножение: 90\*2=180. Этот результат записывается в переменную \<u>a\</u>. Следующая операция: идёт деление на 5. Принцип тот же, что и у SannyBuilder. Переменная делит своё значение на выражение и записывает результат в себя. Следовательно, 180/5=36.

Другие операции будем рассматривать по-необходимости. Сейчас нет смысла нагружать вас этим :)|866|1|0||tipy\_dannykh\_v\_csharpe\_operacii\_nad\_nimi|1511732572 </code></pre></td><td></td><td></td></tr></tbody></table>
