# 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>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lessons.sannybuilder.com/00300/00100/000103.-tipy-dannykh-v-c-.-bazovye-operacii-nad-nimi..md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
