Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Русский_Проект: Изучение Visual Basic C#. Учебный курс


C#. Учебный курс

Здравствуйте, программисты! Сегодня у нас седьмое занятие, в котором мы поговорим о типах для целых чисел.

Целые числа в .NET Framework

Мы уже рассматривали немножко целые числа типа int. Рассмотрим целые числа теперь подробнее.

Возьмем для опытов опять тип int. Это наиболее популярный тип в программировании. Зададимся вопросом, каким наибольшим числом может быть представлен этот тип? Начнем издалека. Напишем небольшую программу:

// Опыты с типом int

using System;

class HowHighInteger
{
    public static void Main()
    {
        int iTest = 2;  // объявляем переменную типа int
        
        System.Console.WriteLine(iTest);
        System.Console.WriteLine(iTest *= iTest);
        System.Console.WriteLine(iTest *= iTest);
        Console.WriteLine(iTest *= iTest); // надоело писать слово System
        Console.WriteLine(iTest *= iTest);
        Console.WriteLine(iTest *= iTest);
        Console.WriteLine(iTest *= iTest);
        Console.WriteLine(iTest *= iTest);
    }
}

Несколько слов о том, что делает программа. Сначала мы объявляем переменную типа int iTest. Чтобы было легче ориентироваться в программе, я в переменной использую маленькую строчную букву i, которая дает понять, что используемая переменная имеет тип int. Далее мы просто умножаем число на себя и повторяем эту операцию несколько раз. Обратите внимание, что на четвертой строке этих операций мне надоело писать слово Console. Чтобы не вводить каждый раз это слово, перед объявлением класса пишем строчку:

using System;

Теперь можно сэкономить время при вводе повторяющих слов. Вообще-то это можно было сделать еще раньше. В следующий раз так и поступим. Запустив программу, вы с удивлением увидите, что в шестой строчке операция умножение числа 65536 на само себя дает в результате 0! Далее число 0 умножается на себя, что дает опять 0. Почему же умножение 65536 на 65536 дает в результате 0? И это еще не все. Присвойте в предыдущей программе переменной iTest начальное значение 3, и вы увидите вообще отрицательные числа:

3
9
81
6561
43046721
-501334399
2038349057
-1970898431

Вы думаете, что ваш компьютер спятил? Чтобы ответить на этот вопрос, надо разобраться, каким образом переменные разных типов обрабатываются компьютером. Информация в компьютерах хранится в виде последовательности бит. Данная тема выходит за рамки нашего руководства. Вам надо только понять (или запомнить), что тип int использует 32 бита (4 байта) для представления числа и способен хранить положительные и отрицательные значения от -2 147 483 648 до 2 147 483 647. Более подробно о том, как хранятся числа в компьютере можно узнать, например, в книге Ч.Петцольда Программирование в тональности C#. Нам интересен сам факт, как происходит переход от положительных значений до отрицательных.

Сделаем следующее. Увеличим на единицу максимальное значение типа int:

int iTest = 2147483647;  // это максимальное значение для int
Console.WriteLine(iTest + 1);

У вас выводится отрицательный результат (-2147483648), так как вы вышли за допустимые пределы. Это явление называется переполнением (overflow). Существует еще явление потери значимости (underflow). Это явление возникает, когда получаемое число меньше минимально допустимого отрицательного значения. Ваша задача - оставаться в границах допустимых значений при программировании ваших программ. Кстати, по умолчанию компилятор C# не обращает внимания на переполнения. Можно изменить данное поведение. Выберите в меню Project | ИмяПроекта | Properties. В диалоговом окне выберите раздел Configuration Properties, затем пункт Build. Установите свойство Check For Arithmetic Overflow/Underflow в True. Запустите программу и она у вас аварийно завершится с выводом сообщения об ошибке переполнения.

Существует и другой способ проверки на переполнение прямо в коде программы. Для этого используется оператор checked:

a = checked(100 * cat);

Если результат умножения выйдет за допустимые пределы 32 бит, то программа завершится с выводом сообщения, независимо от настроек компилятора.

Соответственно, можно отключить вывод сообщения об ошибки, назависимо от настроек компилятора:

a = unchecked (100 * cat);

Примечание: Кстати, можно использовать эти ключевые слова для целых блоков кода, обрамленных фигурными скобками:

checked
{
   c +=3000;
   a = a * c;
   t = a * 7;
}

В этом случае, любое выражение внутри блока, приводящее к переполнению, вызовет исключение.

Мы пока говорили только о типе int, но C# поддерживает еще семь других типов. Поговорим о них.

Если мы занимаемся подсчетом котов, живущих в городе, то, понятно, что количество котов не может быть отрицательным. Тогда нет смысла использовать целые числа со знаком, если половина из всех возможных значений типа int никогда не понадобится. Для этих целей можно использовать 32-разрядный целый тип без знака, называемый uint (юинт). Объявляется переменного подобного типа так:

uint cats;

Числа типа uint начинаются с 0 и заканчиваются 4294967295. Это достаточно большое число. Но данный тип тоже подвержен операциям переполнения, если к максимальному числу прибавить единицу. Если вам не достаточно возможностей типа int и uint, то воспользуйтесь 64-разрядным типом целых long и ulong.

Существуют еще и типы целых чисел, меньше чем int - это 16-разрядные типы short и ushort, 8-разрядные sbyte и byte.

В большинстве случаев, даже если используются небольшие числа, нет смысла использовать 16- и 8-разрядные числа. Дело в том, что современные компьютеры гораздо лучше дружат с типом int и обрабатывают вычисления с этим типом более эффективно.

Поэтому при разработке программы начните с типа int. Этот тип окажется лучшим выбором в 99% случаев. Если вам понадобится значение больше, чем int, то воспользуйтесь типом long. В отдельных случаях вам придется использовать типы short или byte.

Связь с .NET Framework

На самом деле тип int является псевдонимом структуры Int32 в .NET Framework. Остальные типы целых чисел, с которыми мы познакомились, также являются псевдонимами для других структур. Поэтому, вы можете объявить переменную типа int двумя способами:

int cats;   // первый способ в стиле C#
System.Int32 cats;    // второй способ с использованием имени структуры .NET 

Framework

Разницы между этими объявлениями никакой и зависит от ваших привычек. Например, Ч.Петцольд предпочитает первый способ, а Д.Рихтер - второй. Книги обоих авторов весьма популярны среди программистов.

Приведем небольшую таблицу для всех типов целых чисел:

Стиль C#Струкутра .NET
sbyteSystem.Sbyte
byteSystem.Byte
shortSystem.Int16
ushortSystem.UInt16
intSystem.Int32
uintSystem.UInt32
longSystem.Int64
ulongSystem.UInt64

На сегодня хватит. На следующей неделе мы продолжим разговор о целых числах

Удачного вам программирования!

Новая книга

Недавно издательством Питер была выпущена моя новая книга Программирование КПК и смартфонов на .NET Compact Framework. Более подробную информацию о книге вы можете узнать по этому адресу


©2006 А.Климов
Русский_Проект

В избранное