Главная страница Случайная лекция Мы поможем в написании ваших работ! Порталы: БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика Мы поможем в написании ваших работ! |
Преобразование типовВ памяти компьютера все данные, независимо от их типа, представляются в виде последовательностей нулей и единиц. Тип определяет длину этой последовательности и способ ее интерпретации. При объявлении переменной задается ее тип и, следовательно, обе эти характеристики. Однако, в процессе выполнения программы может возникнуть потребность в изменении способа интерпретации некоторого значения переменной, т.е. в преобразовании этого значения к другому типу. Преобразование типов выполняется по определенным правилам, которые устанавливают однозначное соответствие между значениями двух типов. Например, преобразование значения целого типа к вещественному сводится к замене целого числа вещественным с целой частью, равной исходному целому числу и нулевой дробной частью. Еще одним примером является тип char. Значения этого типа, являющиеся символами из набора Unicode, в памяти компьютера представляются своими кодами – двухбайтовыми беззнаковыми целыми, т.е. значениями типа ushort. Следовательно, существует взаимно однозначное соответствие между значениями этих двух типов. Для всех встроенных типов данных существует соответствующее строковое представление. Именно это представление получают при выполнении операций вывода. При вводе данных с клавиатуры, напротив, строковые значения вводимых данных приводятся к типам данных тех переменных, для которых они предназначены. Различают неявное (implicit) и явное (explicit) преобразование типов. Неявное преобразование выполняется компилятором и не требует специальных указаний от программистов. Явноепреобразование. применяется тогда, когда преобразование из типа А в тип В возможно только при определенных обстоятельствах или когда правила для преобразования являются достаточно сложными. 2.3.1. Неявное преобразование типа Неявное (implicit) преобразование возможно лишь для некоторых типов данных. Список этих типов приведен в табл. 7. Таблица 6. Неявные преобразования типов
Неявное приведение типов выполняется при объявлении переменных с их инициализацией, а также при вычислении выражений. Например: float x = 4; char c = 'a'; x = c; Здесь целое значение 4 преобразуется в значение 3.0f при инициализации переменной x, а символьное значение 'a', которым инициализирована переменная с преобразуется в вещественное значение 97.0f (т.к. код символа 'a' равен 97) при выполнении операции присваивания. Можно сформулировать следующее правило неявного преобразования типов. Любой тип А, диапазон возможных значений которого содержится в диапазоне возможных значений типа В, может преобразовываться в этот тип неявным образом. Преобразования типов, ведущие к расширению множества значений, называются расширяющими преобразованиями. В соответствии с этим правилом неявное преобразование типов никогда не может привести к потере точности. По этой причине невозможно, например, неявное приведение вещественного значения к целому. Отметим, что типы bool и string не поддерживают ни одного варианта неявного преобразование. 2.3.2. Явное преобразование типа Если невозможно неявное приведение типов, то программист может выполнить это принудительным образом, выполнив операцию приведения к нужному типу. Эта операция имеет следующий простой синтаксис: (<целевой_тип>) <исходное_значение> Явные (explicit) преобразования типов применяют как сужающие преобразования, т.е. преобразования, приводящие к сужению множества значений. Однако такие преобразования возможны далеко не всегда. Типы, имеющее очень отдаленное отношение или вообще никакого отношения друг к другу, скорее всего, не будут поддерживать преобразования посредством приведения. Рассмотрим следующий пример, в котором предпринимается попытка преобразовать значение типа short в byte с последующим выводом на экран исходного и преобразованного значений: byte myByte; short myShort = 7; myByte = myShort; Console.WriteLine("значение myByte: {0}", myByte); Console.WriteLine("значение myShort: {0}", myShort); Детали организации вывода в консольных приложениях на C# будут рассмотрены в разделе 2.5 настоящей главы. При компиляции этого кода будет выдано следующее сообщение об ошибке: Рис. 2.2. Сообщение об ошибке Cannot implicitly convert type 'short' to 'byte'. An explicit conversion exists (are you missing a cast?) Не удается неявно преобразовать тип "short" в "byte". Существует явное преобразование (возможно, пропущено приведение типов) Последуем полученной рекомендации и выполним явное преобразование типов.
byte myByte; short myShort = 7; myByte = (byte)myShort; Console.WriteLine("значение myByte: {0}", myByte); Console.WriteLine("значение myShort: {0}", myShort);
После выполнения этого кода на экран будут выведены следующие строки:
значение sourceVar: 7 значение destinationVar: 7
Изменим теперь предыдущий код, заменив значение 7 значением 281:
byte myByte; short myShort = 281; myByte = (byte) myShort; Console.WriteLine("значение myShort: {0}", myShort); Console.WriteLine("значение myByte: {0}", myByte);
Это приведет к получению следующего результата:
значение myShort: 281 значение myByte: 25 Чтобы понять причину получения такого неожиданного результата рассмотрим двоичные представления исходного и конечного значений в операции явного приведения типа. Исходное значение представлялось двухбайтным целым и имело вид: 281 = 00000001 000110012 Результат операции приведения к типу byte – это однобайтное целое с двоичным представлением вида: 25 = 000110012 Видно, что произошла потеря левого крайнего бита исходного кода, который размещался в старшем байте, поскольку он просто не уместился в новой переменной. Как же избежать подобных ошибок при преобразовании типов? Для решения этой проблемы существуют два способа. Первый состоит в проверке значения исходной переменной и его сравнении с известными ограничениями целевой переменной, а второй – в принуждении системы обращать особое внимание на данную операцию преобразования во время выполнения. Попытка уместить значение в переменной, когда оно является слишком большим для переменной такого типа, приводит к переполнению. Во избежание возникновения такой ситуации нужно выполнять соответствующую проверку. Проверка возможности переполнения при явном преобразовании типов выполняется операцией checked:
checked((<целевой_тип>)<исходное_значение>)
Если проверка устанавливает факт невозможности безошибочного преобразования типа, то это имеет следствием аварийное завершение программы с отображением сообщения об ошибке. Именно это и произойдет, если в код последнего примера будет добавлена операция проверки преобразования типов (рис. 2.3).
byte myByte; short myShort = 281; myByte = checked((byte) myShort); Console.WriteLine("значение myShort: {0}", myShort); Console.WriteLine("значение myByte: {0}", myByte); Рис. 2.3. Сообщение о переполнении 2.3.3. Операции преобразования для данных строкового типа Строковый тип данных играет особую роль в языках программирования в силу того, что большого значения текстовой информации для человека. В частности, как уже отмечалось, именно строки участвуют в операциях ввода и вывода данных. В то же время к строкам неприменимы операции неявного преобразования типов. По этой причине рассмотрим только явные операции преобразования типов с участием строковых данных.
Дата добавления: 2014-10-10; просмотров: 450; Нарушение авторских прав Мы поможем в написании ваших работ! |