1. Какие бывают числа?
В программировании мы постоянно работаем с числами — от возраста пользователя до числа звёзд в галактике или копеек на банковском счету. Но разные задачи требуют разных видов чисел: иногда важно хранить только целые числа, иногда — очень точные дроби, а иногда нужны числа "без минусов".
Целые числа (int и другие)
Целое число — это число без дробной части.
В C# чаще всего используют тип int, но кроме него есть ещё несколько вариантов, которые отличаются размером и диапазоном.
- int — основной "рабочий" тип для целых чисел. Он вмещает очень большие (и маленькие) значения, а памяти занимает не так уж и много.
Например, для подсчёта лайков, возраста, количества дней в году почти всегда будет использоваться int. - long — используется, если значения могут быть очень большими (например, миллиарды или триллионы).
Пример: хранить сумму всех просмотров YouTube за всю историю. - short — экономичный, но редко используемый тип. Подходит там, где много одинаковых маленьких значений (например, аудиоданные, цветовые компоненты).
- byte — для ещё меньших значений, особенно в графике и работе с файлами, где важна экономия памяти.
Дробные числа (double, float, decimal)
Иногда нужно работать с числами, у которых есть дробная часть. Например, температура воздуха, средний балл студента, цена товара с копейками.
- double — это тип "по умолчанию" для хранения дробных чисел. Достаточно точный для большинства вычислений (пример: 3.1415926535…).
- float — более лёгкий и менее точный тип, чаще встречается в задачах компьютерной графики или обработке больших массивов данных, где важна экономия памяти.
- decimal — предназначен для финансовых и бухгалтерских задач, когда важно сохранить точность до копеек, чтобы избежать "потери" из-за особенностей хранения дробных чисел. Например, для хранения баланса на счету, стоимости товара, обменного курса.
Специальные числовые типы
В C# есть дополнительные числовые типы для особых случаев:
- uint, ulong, ushort — "беззнаковые" типы, позволяют использовать только положительные значения, зато диапазон в 2 раза больше по сравнению с их "знаковыми" аналогами.
- sbyte — маленький, знаковый тип (для компактного хранения отрицательных и положительных значений от -128 до 127).
- BigInteger — если нужно работать с огромными числами, превышающими стандартные диапазоны, например, в криптографии или вычислениях в астрономии.
2. Знаковые и беззнаковые числа
Знаковый тип может хранить как положительные, так и отрицательные числа. Это удобно, когда значения могут быть "и выше, и ниже нуля": например, температура, баланс счёта, высота относительно уровня моря.
Беззнаковый тип — только ноль и положительные числа. Подходит, когда минуса не может быть — например, количество людей в комнате, байты в файле, время.
Пример:
- int (знаковый): -10, 0, 50
- uint (беззнаковый): 0, 10, 1000
Используя беззнаковый тип, можно вместить в переменную в 2 раза больше максимального значения (так как нет "отрицательной половины диапазона"). Их используют, когда точно известно, что значение не может быть отрицательным.
Знаковые целые типы
| Тип | Размер | Диапазон значений | Пример использования |
|---|---|---|---|
|
1 байт | -128 до 127 | -128, 0, 127 |
|
2 байта | -32 768 до 32 767 | -1000, 0, 32000 |
|
4 байта | -2 147 483 648 до 2 147 483 647 | -1000000, 0, 2000000 |
|
8 байт | -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 |
-10_000_000_000, 1 |
Беззнаковые целые типы
| Тип | Размер | Диапазон значений | Пример использования |
|---|---|---|---|
|
1 байт | 0 до 255 | 0, 128, 255 |
|
2 байта | 0 до 65 535 | 1000, 65000 |
|
4 байта | 0 до 4 294 967 295 | 100, 4000000000 |
|
8 байт | 0 до 18 446 744 073 709 551 615 | 1, 18_000_000_000_000 |
Дробные типы
| Тип | Размер | Пример значений | Описание |
|---|---|---|---|
|
4 байта | 3.14f, -0.001f | одинарная точность (7 цифр) |
|
8 байт | 3.1415, -1.7E+308 | двойная точность (15-16 цифр) |
|
16 байт | 0.1m, 12345.6789m | высокая точность для финансов |
3. Суффиксы для чисел
В некоторых ситуациях нужно явно указать, какого типа ты хочешь использовать число. Это делается при помощи суффиксов:
- L или l — для типа long (например, 10000000000L)
- U или u — для типа uint (например, 123U)
- F или f — для типа float (например, 3.14f)
- D или d — для типа double (обычно не нужен, потому что дробные числа без суффикса — это double)
- M или m — для типа decimal (например, 99.99m — особенно важно в деньгах!)
Если не указать суффикс, то по умолчанию целое число считается int, а дробное — double. Например, 42 это int, а 3.14 это double.
Зачем это нужно? Например, чтобы не получить ошибку при присваивании большого числа переменной типа long:
long bigNumber = 9000000000L; // если убрать L, будет ошибка компиляции
А для денег лучше всегда использовать decimal с суффиксом m:
decimal price = 999.99m;
4. Разделитель в виде подчёркивания _
Когда числа длинные, легко запутаться в нолях. Для красоты и удобства чтения в C# можно использовать подчёркивания внутри числа.
int population = 146_700_000;
long stars = 100_000_000_000L;
Это абсолютно легально: компилятор игнорирует подчёркивания, а вам удобно сразу "на глаз" видеть разряды. Главное — не ставить подчёркивание в начале, в конце, после точки или перед суффиксом.
5. Символьный тип char
Иногда в программе нужно работать не с числами, а с отдельными символами: буквой, цифрой, знаком, и даже пробелом. Для этого есть специальный тип — char.
Что такое char?
Это переменная, которая хранит один символ:
- латинскую или кириллическую букву ('A', 'я')
- цифру ('5')
- спецсимвол ('#', '%', '@')
- управляющий символ ('\\n' — перевод строки)
Особенности:
- Значение типа char записывается в одиночных кавычках: char letter = 'B';
- На самом деле внутри char хранится числовой код символа (в системе Unicode), поэтому char можно сравнивать, преобразовывать в int и даже выполнять простую арифметику:
char a = 'A';
char b = (char)(a + 1); // 'B'
int code = a; // 65 — код буквы 'A'
Можно использовать специальные символы, например: char tab = '\\t'; // символ табуляции
Зачем нужен char?
Для работы с текстом посимвольно (например, проверки первой буквы в строке, поиска знаков препинания, считывания пароля по символу).
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ