Особенности использования целочисленных значений
Из этой лекции вы узнаете об особенностях операций над целочисленными значениями.
Напомним, что первым параметром при объявлении или инициализации переменной является тип данных. Тип данных определяет с какими характеристиками будет хранится значение. Типы данных, предназначенные для хранения целых чисел, являются примитивными типами и значения с такими типами данных хранятся в стеке.
Ниже приведен список типов данных для хранения целых чисел:
byte: хранит целое число от 0 до 255 и занимает 1 байт.
short: хранит целое число от -32768 до 32767 и занимает 2 байта.
ushort, хранит целое число от 0 до 65 535 и занимает 2 байта.
int: хранит целое число от -2147483648 до 2147483647 и занимает 4 байта.
uint: хранит целое число от 0 до 4294967295 и занимает 4 байта
long: хранит целое число от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 и занимает 8 байт.
Возникает вопрос. Для чего необходимо такое количество типов данных для хранения целочисленных значений?
В качестве примера, приведем программу для учета возраста населения, где в переменную будет записан возраст человека в полных годах. Первое, что нужно сделать это выбрать тип данных для переменной.
На момент написания статьи, максимальная продолжительность жизни составила 122 года. Давайте посмотрим, как двоичная запись числа 122 будет выглядеть в переменных с различными типами данных. Так как, возраст не может быть отрицательным, то для хранения значения возраста, выберем тип данных для хранения положительного числа.
Тип данных byte. Может хранить любой целое число от 0 до 255 и занимает 1 байт(8 бит)
Тип данных uint. Целое число от 0 до 4294967295, занимает 4 байта(32 бит)
Как видим, оба типа данных подходят для хранения возраста человека. Однако если оценить эффективность использования аппаратных ресурсов тип данных byte предпочтительней, в то время как тип данных uint избыточен.
Наглядно видно, что для переменной с типом данных uint выделен блок из ячеек размером 4 байта или 32 ячейки. Что в этом плохого? Под переменную выделено 32 ячейки, поэтому, все 32 ячейки памяти будут учувствовать во всех операциях, производимых с этой переменной. На инициализацию, хранение и обработку всех 32 ячеек, в том числе и на неиспользуемые 24 разряда, будут тратится аппаратные ресурсы вычислительной системы. Еще одним минусом, является размер занимаемой памяти. Так размер занимаемой памяти для хранения данных возраста одной тысячи человек в случае с типом данных byte будет занимать 1000чел Х 8 бит= 8000 бит—один килобайт памяти, а с типом данных uint —4 кБ, т.е. в четыре раза больше.
Возникает вопрос, почему столь эффективный, с аппаратной стороны, тип данных byte не использовать повсеместно. Для чего нужны остальные типы данных?
Для ответа на этот вопрос, напишем программу подсчета общей продолжительности жизни трех долгожителей, которым больше 100 лет.
Здесь нужно указать на одну из особенностей VS. Конструкция операции присвоения значения состоит из левого операнда-переменной и правого операнда значения, где левому операнду-переменной тип данных указывается явно, а характеристики правого операнда определяются по формату записи. Однако результату арифметических операциях, когда, к примеру складываются два числа, VS автоматически назначает тип данных — int.
Нам же для учебных целей, результат сложения понадобится с типом данных byte. Для этого воспользуемся операцией явного привидения типов.
Явное привидение —операция, когда операнду-значению явно указывается тип данных. Для этого достаточно в операнде-значении указать в скобках какой тип нужен. О преобразовании типов будет отдельная лекция.
static void Main(string[] args)
{
byte age1 = 122;
byte age2 = 102;
byte age3 = 120;
byte sumByte = (byte)(age1 + age2 + age3);
Console.WriteLine("Запись числа 344 в переменную sumByte = " + sumByte);
int sumInt = age1 + age2 + age3;
Console.WriteLine("Запись числа 344 в переменную sumInt = " + sumInt);
}
В строке: byte sumByte = (byte)(age1 + age2 + age3); применена операция по преобразование типов — явное привидение типа данных.
Запустим программу. И видим у переменной « sumByte » с типом данных « byte » очень неожиданный результат.
Результатом операции сложения: 122 + 102 + 120, будет число 344, которое записывается в переменную sumByte, с явным привидением изменением с автоматического типа int на тип данных byte. Число 344 выходит за рамки диапазона типа данных byte, поэтому была сохранена только часть значения.
Визуальное представление хранения числа 344 в переменных sumByte и sumInt
Визуально видно, что для записи числа 344 требуется 9 ячеек памяти.
Мы же, явным привидением типов (byte)(age1 + age2 + age3); отменили неявное автоматическое преобразование результата сложения и вместо типа данных int
операнд- справа получил тип данных byte. Восьми конденсаторов, ячеек памяти, физически не хватило для размещения числа 344.
В случае с переменной « sumInt », VS по умолчанию указала для результата сложения тип данных int, который имеет 32 разряда и может хранить числа в диапазоне от -2147483648 до 2147483647.
Однако тип данных int не оптимален для данной программы. Так int хранит как положительные, так и отрицательные числа, а при учете возраста отрицательных чисел быть не может, оптимальным типом в данном случае является тип данных uint, который хранит положительные целые числа в диапазоне от 0 до 4294967295.
У вас, наверное, возник вопрос: «Как тип данных «int» занимает 4 байта и хранить числа в диапазоне от -2147483648 до 2147483647, а «uint» в тех же 4 байтах хранит число в диапазоне от 0 до 4294967295»?
Все очень просто. В случае с «int», старший, 32 разряд, выделяется под указание положительное или отрицательное значение будет хранится. Ноль в 32 разряде указывает, что число положительное, а единица — отрицательное. Таким образом для хранения числа остается только 31 разряд, что и соответствует диапазону хранимого значения.
В заключении.
Выбор типа данных для переменной, это всегда компромисс между эффективностью использования ресурсов и опасностью возникновения ошибок при неверном выборе.
На этом занятие закончено.
Вы можете самостоятельно найти задачи для закрепления теоретического материала или для получения задач с ответами отправьте письмо на basicprog@mail.ru
Удачи в выполнении практических заданий!