русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Преобразование типов


Дата добавления: 2015-01-16; просмотров: 753; Нарушение авторских прав


Если в выражениях встречаются операнды различных типов,то они преобразуются к общему типу в соответствии с неболь-шим набором правил. В общем, автоматически производятсятолько преобразования, имеющие смысл, такие как, например,преобразование целого в плавающее в выражениях типа F+I. Вы-ражения же, лишенные смысла, такие как использование пере-менной типа FLOAT в качестве индекса, запрещены. Во-первых, типы CHAR и INT могут свободно смешиваться варифметических выражениях: каждая переменная типа CHAR авто-матически преобразуется в INT. Это обеспечивает значительнуюгибкость при проведении определенных преобразований симво-лов. Примером может служить функция ATOI, которая ставит всоответствие строке цифр ее численный эквивалент. ATOI(S) /* CONVERT S TO INTEGER */ CHAR S[]; { INT I, N; N = 0; FOR ( I = 0; S[I]>='0' && S[I]<='9'; ++I) N = 10 * N + S[I] - '0'; RETURN(N); } KAK Уже обсуждалось в главе 1, выражение S[I] - '0' имеет численное значение находящегося в S[I] символа, потомучто значение символов '0', '1' и т.д. образуют возрастающуюпоследовательность расположенных подряд целых положительныхчисел. Другой пример преобразования CHAR в INT дает функцияLOWER, преобразующая данную прописную букву в строчную. Есливыступающий в качестве аргумента символ не является пропис-ной буквой, то LOWER возвращает его неизменным. Приводимаяниже программа справедлива только для набора символов ASCII. LOWER(C) /* CONVERT C TO LOWER CASE; ASCII ONLY */INT C;{ IF ( C >= 'A' && C <= 'Z' ) RETURN( C + '@' - 'A'); ELSE /*@ Записано вместо 'A' строчного*/ RETURN(C);} Эта функция правильно работает при коде ASCII, потому чточисленные значения, соответствующие в этом коде прописным истрочным буквам, отличаются на постоянную величину, а каждыйалфавит является сплошным - между а и Z нет ничего, кромебукв. Это последнее замечание для набора символов EBCDICсистем IBM 360/370 оказывается несправедливым, в силу чегоэта программа на таких системах работает неправильно - онапреобразует не только буквы. При преобразовании символьных переменных в целые возни-кает один тонкий момент. Дело в том, что сам язык не указы-вает, должны ли переменным типа CHAR соответствовать числен-ные значения со знаком или без знака. Может ли при преобра-зовании CHAR в INT получиться отрицательное целое? К сожале-нию, ответ на этот вопрос меняется от машины к машине, отра-жая расхождения в их архитектуре. На некоторых машинах(PDP-11, например) переменная типа CHAR, крайний левый биткоторой содержит 1, преобразуется в отрицательное целое("знаковое расширение"). На других машинах такое преобразо-вание сопровождается добавлением нулей с левого края, в ре-зультате чего всегда получается положительное число. Определение языка "C" гарантирует, что любой символ изстандартного набора символов машины никогда не даст отрица-тельного числа, так что эти символы можно свободно использо-вать в выражениях как положительные величины. Но произволь-ные комбинации двоичных знаков, хранящиеся как символьныепеременные на некоторых машинах, могут дать отрицательныезначения, а на других положительные. Наиболее типичным примером возникновения такой ситуацииявляется сучай, когда значение 1 используется в качествеEOF. Рассмотрим программу CHAR C; C = GETCHAR(); IF ( C == EOF ) ... На машине, которая не осуществляет знакового расширения,переменная 'с' всегда положительна, поскольку она описанакак CHAR, а так как EOF отрицательно, то условие никогда невыполняется. Чтобы избежать такой ситуации, мы всегда пре-дусмотрительно использовали INT вместо CHAR для любой пере-менной, получающей значение от GETCHAR. Основная же причина использования INT вместо CHAR несвязана с каким-либо вопросом о возможном знаковом расшире-нии. просто функция GETCHAR должна передавать все возможныесимволы (чтобы ее можно было использовать для произвольноговвода) и, кроме того, отличающееся значение EOF. Следова-тельно значение EOF не может быть представлено как CHAR, адолжно храниться как INT. Другой полезной формой автоматического преобразованиятипов является то, что выражения отношения, подобные I>J, илогические выражения, связанные операциями && и \!\!, по оп-ределению имеют значение 1, если они истинны, и 0, если ониложны. Таким образом, присваивание ISDIGIT = C >= '0' && C <= '9'; полагает ISDIGIT равным 1, если с - цифра, и равным 0 в про-тивном случае. (В проверочной части операторов IF, WHILE,FOR и т.д. "Истинно" просто означает "не нуль"). Неявные арифметические преобразования работают в основ-ном, как и ожидается. В общих чертах, если операция типа +или *, которая связывает два операнда (бинарная операция),имеет операнды разных типов, то перед выполнением операции"низший" тип преобразуется к "высшему" и получается резуль-тат "высшего" типа. Более точно, к каждой арифметическойоперации применяется следующая последовательность правилпреобразования. - Типы CHAR и SHORT преобразуются в INT, а FLOAT вDOUBLE. - Затем, если один из операндов имеет тип DOUBLE, тодругой преобразуется в DOUBLE, и результат имеет тип DOUBLE. - В противном случае, если один из операндов имеет типLONG, то другой преобразуется в LONG, и результат имеет типLONG. - В противном случае, если один из операндов имеет типUNSIGNED, то другой преобразуется в UNSIGNED и результатимеет тип UNSIGNED. - В противном случае операнды должны быть типа INT, ирезультат имеет тип INT.Подчеркнем, что все переменные типа FLOAT в выражениях пре-образуются в DOUBLE; в "C" вся плавающая арифметика выполня-ется с двойной точностью. Преобразования возникают и при присваиваниях; значениеправой части преобразуется к типу левой, который и являетсятипом результата. Символьные переменные преобразуются в це-лые либо со знаковым расширением ,либо без него, как описановыше. Обратное преобразование INT в CHAR ведет себя хорошо -лишние биты высокого порядка просто отбрасываются. Таким об-разом INT I;CHAR C; I = C;C = I; значение 'с' не изменяется. Это верно независимо от того,вовлекается ли знаковое расширение или нет. Если х типа FLOAT, а I типа INT, то как х = I;так и I = х; приводят к преобразованиям; при этом FLOAT преобразуется вINT отбрасыванием дробной части. Тип DOUBLE преобразуется воFLOAT округлением. Длинные целые преобразуются в более ко-роткие целые и в переменные типа CHAR посредством отбрасыва-ния лишних битов высокого порядка. Так как аргумент функции является выражением, то при пе-редаче функциям аргументов также происходит преобразованиетипов: в частности, CHAR и SHORT становятся INT, а FLOATстановится DOUBLE. Именно поэтому мы описывали аргументыфункций как INT и DOUBLE даже тогда, когда обращались к нимс переменными типа CHAR и FLOAT. Наконец, в любом выражении может быть осуществлено("принуждено") явное преобразование типа с помощью конструк-ции, называемой перевод (CAST). В этой конструкции, имеющейвид (имя типа) выражение Выражение преобразуется к указанному типу по правилампреобразования, изложенным выше. Фактически точный смыслоперации перевода можно описать следующим образом: выражениекак бы присваивается некоторой переменной указанного типа,которая затем используется вместо всей конструкции. Напри-мер, библиотечная процедура SQRT ожидает аргумента типаDOUBLE и выдаст бессмысленный ответ, если к ней по небреж-ности обратятся с чем-нибудь иным. таким образом, если N -целое, то выражение SQRT((DOUBLE) N) до передачи аргумента функции SQRT преобразует N к типуDOUBLE. (Отметим, что операция перевод преобразует значениеN в надлежащий тип; фактическое содержание переменной N приэтом не изменяется). Операция перевода имрация перевода име-ет тот же уровень старшинства, что и другие унарные опера-ции, как указывается в таблице в конце этой главы. Упражнение 2-2 --------------- Составьте программу для функции HTOI(S), которая преоб-разует строку шестнадцатеричных цифр в эквивалентное ей це-лое значение. При этом допустимыми цифрами являются цифры от1 до 9 и буквы от а до F.


<== предыдущая лекция | следующая лекция ==>
Операции отношения и логические операции | Операции увеличения и уменьшения


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.874 сек.