Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Операции отношения и логические операцииСодержание книги
Поиск на нашем сайте
2.7. Преобразование типов Если в выражениях встречаются операнды различных типов,то они преобразуются к общему типу в соответствии с неболь-шим набором правил. В общем, автоматически производятсятолько преобразования, имеющие смысл, такие как, например,преобразование целого в плавающее в выражениях типа 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.
|
||||
Последнее изменение этой страницы: 2016-08-26; просмотров: 199; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.177.72 (0.005 с.) |