VirQ. Приведение целых типов в C#
Язык C# входит в ТОП-5
самых популярных языков
программирования
Главная / Приведение типов /
Приведение целых типов
Статей на сайте: 61

Приведение целых типов


Данная тема как никакая другая чрезвычайно обширна, если рассматривать приведение типов в ООП-программировании.
Здесь будет рассмотрено приведение целых типов чисел.
Например, возьмём вот такое выражение:
[code] byte n = 250; [/code]
Но если записать число, выходящее за пределы:
[code] byte n = 270; //Тут будет ошибка [/code]
Текст ошибки: Постоянное значение "270" не может быть преобразовано в "byte"
Дело в том, что 270 выходит за пределы допустимых значений byte (от 0 до 270). Вы можете это посмотреть в таблице целочисленных типов.
Главное - чтобы от знака "=" числа были одного типа.
Либо тип слева от знака равенства был "больше по диапазону", чем тот, что справа от знака "равно".
Например, тут ошибки не будет:
[code] short n = 270; //270 входит в диапазон short (-32768 до +32767) [/code]
Приписав уменьшающий тип в скобках перед числом (byte)270 получим ограничение этого числа.
Рассмотрим ограничение, применимое к непосредственным числам. Например, вышеупомянутый пример: число 270.
[code] byte n = (byte)270; //Получим число: 14 [/code]

Откуда 14? При приведении типов к byte мы будем получать число от 0 до 255. Это остаток от деления на 256. Для большего понимания пример:
[code] (byte)253 - результат 253 (byte)254 - результат 254 (byte)255 - результат 255 (byte)256 - результат 0 (byte)257 - результат 1 (byte)258 - результат 2 (byte)259 - результат 3 (byte)260 - результат 4 ... (byte)510 - результат 254 (byte)511 - результат 255 (byte)512 - результат 0 (byte)513 - результат 1 [/code]
Какое число бы вы ни задали, оно будет в пределах от 0 до 255 при приведении к типу byte. И оно не будет обрезано именно до 255.
[code] byte z = (byte)k; //Приводим число k типу byte int b = (int)h; //Приводим число h типу b [/code]
Приведение типов - это ограничение диапазона, в который входит это число.

Казалось бы, число 5 может входить в любой диапазон byte, sbyte, short, ushort, int, uint, long, ulong.
Однако вот это будет ошибкой:
[code] long z = 5; int m = z; //ошибка. long больше int. Необходимо long уменьшить до int int m = (int)z; //вот так верно [/code]

Далее. Это не ошибка:
[code] byte n = 250; int k = n; //Нет ошибки. Значение типа byte можно присвоить к int
[/code]
int больше byte, поэтому любое число byte входит в диапазон int, не вызывая ошибок
А вот так будет ошибка:
[code] int n = 250; byte k = n; //Ошибка. Значение типа int нельзя присвоить к byte [/code]
Не каждое число int может войти в диапазон byte. Даже в данном случае, когда 250 входит и в byte и в int. Таковы уж правила C#.

Даже если мы, как люди, видим, что 250 можно присвоить к byte, компьютер "осторожничает" и предупреждает, что int нельзя приравнять к byte. Сначала ОГРАНИЧЬТЕ его диапазоны. Это и есть приведение типов. Следующий код ошибку не даст:
[code] int n = 250; byte k = (byte)n; //Получаем: 250, не вызвав исключение [/code]
В общем получается так, что МЕНЬШИЙ тип можно присвоить к БОЛЬШЕМУ типу. Но не наоборот.
Рассмотрим ещё один случай:
[code] int n = 1000; long k = 1000000; int z = k + n; [/code]
На 3 строке вы получите предупреждение:
Неявное преобразование типа "long" в "int" невозможно. Существует явное преобразование (возможно, отсутствует приведение) Здесь выходов 2.
1 вариант. Понизить диапазон k (long) до уровня int:
[code] int n = 1000; long k = 1000000; int z = (int)k + n; //Привели k к типу int [/code]
2 вариант. Повысить диапазон результата z до уровня long:
[code] int n = 1000; long k = 1000000; long z = k + n; //Заменили 'int z' на 'long z' [/code]

Дополнительная информация о том, как вывести результат в консоли или WinForm