|
| 1 | +Console.WriteLine("-----------------Implicit and explicit type casting-----------------"); |
| 2 | + |
| 3 | +short s = 300; |
| 4 | +int i = s; // Неявное приведение к типу "int" (расширяющее преобразование безопасно, поэтому происходит неявно) |
| 5 | + |
| 6 | +byte b = unchecked((byte)s); // Явное приведение к типу "byte" при сужающем преобразовании. Также явное указание игнорировать ошибки переполнения с помощью оператора "unchecked". |
| 7 | +Console.WriteLine(b); // 44 (так как произошло переполнение) |
| 8 | + |
| 9 | +ushort us = 500; |
| 10 | +i = us; // Неявное приведение к типу "int" (расширяющее преобразование безопасно, поэтому происходит неявно) |
| 11 | + |
| 12 | +us = (ushort)i; // Явное приведение к типу "ushort" при сужающем преобразовании. |
| 13 | + |
| 14 | +float f = 100.8F; |
| 15 | +double d = f; // Неявное приведение к типу "double" (расширяющее преобразование безопасно, поэтому происходит неявно) |
| 16 | +f = (float)d; // Явное приведение к типу "float" при сужающем преобразовании. |
| 17 | + |
| 18 | +decimal dec = (decimal)f; // Приведение "float" и "double" к "decimal" всегда требует явного преобразования |
| 19 | + |
| 20 | +dec = us; // Целочисленные типы приводятся к "decimal" неявно |
| 21 | + |
| 22 | +f = i; // Преобразование целочисленных типов к типам IEEE 754 cчитается расширяющим и происходит неявно (см. нюанс в ответах на домашнее задание) |
| 23 | + |
| 24 | +i = (int)f; // Явное приведение к типу "int" при сужающем преобразовании (дробная часть просто отбрасывается). |
| 25 | + |
| 26 | +byte carSpeed = 60; |
| 27 | +byte bikeSpeed = (byte)(carSpeed + 40); // Необходимо явное приведение, так как при арифметических операциях с целыми числами операнды подтягиваются до "int" или "long", если не хватает "int" |
| 28 | + |
| 29 | +carSpeed = (byte)(carSpeed - 20); // Необходимо явное приведение даже при присваивании той же переменной |
| 30 | +carSpeed -= 20; // При составном присваивании явное приведение не требуется |
| 31 | + |
| 32 | +uint strLength = (uint)"str".Length; // Необходимо явное приведение, так как свойство "Length" имеет тип "int" |
| 33 | +int strLen = "str".Length; // Явное приведение не требуется, так как типы совпадают |
| 34 | + |
| 35 | + |
| 36 | +Console.WriteLine("\n-----------------Overflow-----------------"); |
| 37 | + |
| 38 | +// Двоичное представление чисел |
| 39 | +// 0000 0001 0010 1100 - 300 в short |
| 40 | +// 0010 1100 - 44 в byte |
| 41 | + |
| 42 | +//byte notCompiled = 256; // Код не компилируется, так как компилятор сразу видит переполнение |
| 43 | +//byte notCompiled2 = 200 + 56; // Код не компилируется, так как компилятор сразу видит переполнение (компилятор умеет выполнять арифметические операции с литералами) |
| 44 | + |
| 45 | +//const int constNum = 56; |
| 46 | +//byte notCompiled3 = 200 + constNum; // Код не компилируется, так как компилятор сразу видит переполнение (компилятор умеет выполнять арифметические операции с константами) |
| 47 | + |
| 48 | +int num = 56; |
| 49 | +byte overflow1 = (byte)(200 + num); // Код компилируется и приводит к переполнению на этапе выполнения (компилятор не умеет выполнять арифметические операции с переменными) |
| 50 | +//byte overflow1 = checked((byte)(200 + num)); // Явная проверка переполнения с помощью оператора "checked" (произойдёт ошибка) |
| 51 | + |
| 52 | +Console.WriteLine(overflow1); // 0 (так как произошло переполнение) |
| 53 | + |
| 54 | +byte overflow2 = 255; |
| 55 | +overflow2++; |
| 56 | + |
| 57 | +// Явная проверка переполнения с помощью блочного выражения "checked" (произойдёт ошибка) |
| 58 | +//checked |
| 59 | +//{ |
| 60 | +// overflow2++; |
| 61 | +//} |
| 62 | + |
| 63 | +Console.WriteLine(overflow2); // 0 (так как произошло переполнение) |
| 64 | + |
| 65 | + |
| 66 | +Console.WriteLine("\n-----------------No overflow for IEEE 754 floating types-----------------"); |
| 67 | + |
| 68 | +float infinity = float.MaxValue * 2; |
| 69 | +Console.WriteLine(infinity); // ∞ |
| 70 | + |
| 71 | +Console.WriteLine(5.0 / 0); // ∞ |
| 72 | +Console.WriteLine(0.0 / 0); // NaN при делении на ноль чисел с плавающей точкой |
| 73 | + |
| 74 | +//int zero = 0; |
| 75 | +//Console.WriteLine(5 / zero); // Ошибка "System.DivideByZeroException" при целочисленном делении на 0 |
| 76 | + |
| 77 | + |
| 78 | +Console.WriteLine("\n-----------------Numeric types members-----------------"); |
| 79 | + |
| 80 | +Console.WriteLine(int.MinValue); // -2147483648 |
| 81 | +Console.WriteLine(int.MaxValue); // 2147483647 |
| 82 | + |
| 83 | +Console.WriteLine(int.IsEvenInteger(10)); // True |
| 84 | +Console.WriteLine(int.Abs(-5)); // 5 |
| 85 | + |
| 86 | +Console.WriteLine(double.Pi); // 3,141592653589793 |
| 87 | +Console.WriteLine(double.E); // 2,718281828459045 |
| 88 | +Console.WriteLine(double.NegativeInfinity); // -∞ |
| 89 | + |
| 90 | + |
| 91 | +Console.WriteLine("\n-----------------Parse numbers from strings-----------------"); |
| 92 | + |
| 93 | +int intNum = int.Parse("25"); // Парсинг целого числа из строки |
| 94 | +double doubleNum = double.Parse("5,8"); // Парсинг дробного числа из строки |
| 95 | +//int notNum = int.Parse("Hello!"); // Ошибка "System.FormatException" при парсинге числа, так как строка содержит не число |
| 96 | + |
| 97 | +Console.Write("Enter a number: "); // Enter a number: |
| 98 | +string numberStr = Console.ReadLine(); // Считывание введённой в консоль строки и помещение её в переменную "numberStr" |
| 99 | +Console.WriteLine(numberStr); // Вывод считанной строки в консоль |
| 100 | + |
| 101 | +//int number = int.Parse(numberStr); // Парсинг считанной строки в число |
| 102 | +int number = Convert.ToInt32(numberStr); // Аналог строки выше, но с помощью класса "Convert". За кулисами всё равно используется "int.Parse". |
| 103 | +int doubled = number * 2; // Умножение числа на 2 |
| 104 | +bool isPositive = int.IsPositive(number); // Проверка, является ли число положительным |
0 commit comments