22.4. Явные преобразования указателей
Разрешаются определенные преобразования, с использовани-
ем указателей , но они имеют некоторые зависящие от конкрет-
ной реализации аспекты. Все эти преобразования задаются с
помощью операции явного преобразования типа; см. П. 15.2 и
16.7.
Указатель может быть преобразован в любой из целочислен-
ных типов, достаточно большой для его хранения. Требуется ли
при этом INT или LONG, зависит от конкретной машины. Преоб-
разующая функция также является машинно-зависимой, но она
будет вполне естественной для тех, кто знает структуру адре-
сации в машине. Детали для некоторых конкретных машин приво-
дятся ниже.
Объект целочисленного типа может быть явным образом пре-
образован в указатель. такое преобразование всегда переводит
преобразованное из указателя целое в тот же самый указатель,
но в других случаях оно будет машинно-зависимым.
· 221 -
Указатель на один тип может быть преобразован в указа-
тель на другой тип. Если преобразуемый указатель не указыва-
ет на объекты, которые подходящим образом выравнены в памя-
ти, то результирующий указатель может при использовании вы-
зывать ошибки адресации. Гарантируется, что указатель на
объект заданного размера может быть преобразован в указатель
на объект меньшего размера и снова обратно, не претерпев при
этом изменения.
Например, процедура распределения памяти могла бы прини-
мать запрос на размер выделяемого объекта в байтах, а возв-
ращать указатель на символы; это можно было бы использовать
следующим образом.
EXTERN CHAR *ALLOC();
DOUBLE *DP;
DP=(DOUBLE*) ALLOC(SIZEOF(DOUBLE));
*DP=22.0/7.0;
Функция ALLOC должна обеспечивать (машинно-зависимым спосо-
бом), что возвращаемое ею значение будет подходящим для пре-
образования в указатель на DOUBLE; в таком случае использо-
вание этой функции будет переносимым.
Представление указателя на PDP-11 соответствует 16-бито-
вому целому и измеряется в байтах. Объекты типа CHAR не име-
ют никаких ограничений на выравнивание; все остальные объек-
ты должны иметь четные адреса.
На HONEYWELL 6000 указатель соответствует 36-битовому
целому; слову соответствует 18 левых битов и два непосредст-
венно примыкающих к ним справа бита, которые выделяют символ
в слове. Таким образом, указатели на символы измеряются в
единицах 2 в степени 16 байтов; все остальное измеряется в
единицах 2 в степени 18 машинных слов. Величины типа DOUBLE
и содержащие их агрегаты должны выравниваться по четным ад-
ресам слов (0 по модулю 2 в степени 19). Эвм IBM 370 и
INTERDATA 8/32 сходны между собой. На обеих машинах адреса
измеряются в байтах; элементарные объекты должны быть выров-
нены по границе, равной их длине, так что указатели на SHORT
должны быть кратны двум, на INT и FLOAT - четырем и на
DOUBLE - восьми. Агрегаты выравниваются по самой строгой
границе, требуемой каким-либо из их элементов.
23. Константные выражения
В нескольких местах в языке “C” требуются выражения, ко-
торые после вычисления становятся константами: после вариан-
тного префикса CASE, в качестве границ массивов и в инициа-
лизаторах. В первых двух случаях выражение может содержать
только целые константы, символьные константы и выражения
SIZEOF, возможно связанные либо бинарными операциями
+ - * / . % & \! Ч << >> == 1= <> <= >=
либо унарными операциями
- \^
либо тернарной операцией ?:
·
222 -
Круглые скобки могут использоваться для группировки, но не
для обращения к функциям.
В случае инициализаторов допускается большая (ударение
на букву о) свобода; кроме перечисленных выше константных
выражений можно также применять унарную операцию & к внешним
или статическим объектам и к внешним или статическим масси-
вам, имеющим в качестве индексов константное выражение.
Унарная операция & может быть также применена неявно, в ре-
зультате появления неиндексированных массивов и функций. Ос-
новное правило заключается в том, что после вычисления ини-
циализатор должен становится либо константой, либо адресом
ранее описанного внешнего или статического объекта плюс или
минус константа.
24. Соображения о переносимости
Некоторые части языка “C” по своей сути машинно-зависи-
мы. Следующие ниже перечисление потенциальных трудностей хо-
тя и не являются всеобъемлющими, но выделяет основные из
них.
Как показала практика, вопросы, целиком связанные с ап-
паратным оборудованием, такие как размер слова, свойства
плавающей арифметики и целого деления, не представляют осо-
бенных затруднений. Другие аспекты аппаратных средств нахо-
дят свое отражение в различных реализациях. Некоторые из
них, в частности, знаковое расширение (преобразующее отрица-
тельный символ в отрицательное целое) и порядок, в котором
помещаются байты в слове, представляют собой неприятность,
которая должна тщательно отслеживаться. Большинство из ос-
тальных проблем этого типа не вызывает сколько-нибудь значи-
тельных затруднений.
Число переменных типа REGISTER, которое фактически может
быть помещено в регистры, меняется от машины к машине, также
как и набор допустимых для них типов. Тем не менее все ком-
пиляторы на своих машинах работают надлежащим образом; лиш-
ние или недопустимые регистровые описания игнорируются.
Некоторые трудности возникают только при использовании
сомнительной практики программирования. Писать программы,
которые зависят от каких- либо этих свойств, является чрез-
вычайно неразумным.
Языком не указывается порядок вычисления аргументов фун-
кций; они вычисляются справа налево на PDP-11 и VAX-11 и
слева направо на остальных машинах. порядок, в котором про-
исходят побочные эффекты, также не специфицируется.
Так как символьные константы в действительности являются
объектами типа INT, допускается использование символьных
констант, состоящих из нескольких символов. Однако, посколь-
ку порядок, в котором символы приписываются к слову, меняет-
ся от машины к машине, конкретная реализация оказывается
весьма машинно-зависимой.
Присваивание полей к словам и символов к целым осуществ-
ляется справо налево на PDP-11 и VAX-11 и слева направо на
других машинах. эти различия незаметны для изолированных
программ, в которых не разрешено смешивать типы (преобразуя,
например, указатель на INT в указатель на CHAR и затем про-
веряя указываемую память), но должны учитываться при согла-
совании с накладываемыми извне схемами памяти.
· 223 -
Язык, принятый на различных компиляторах, отличается
только незначительными деталями. Самое заметное отличие сос-
тоит в том, что используемый в настоящее время компилятор на
PDP-11 не инициализирует структуры, которые содержат поля
битов, и не допускает некоторые операции присваивания в оп-
ределенных контекстах, связанных с использованием значения
присваивания.
... основаниям. При этом философская абстракция языка оказывается неразрывно связана с основными темами и движениями философии в целом. Более конкретно, на ранние стадии традиционно рассматриваемого в рамках АФ анализа обыденного языка глубокое влияние оказала философия Дж. Э. Мура, особенно его учение о здравом смысле, согласно которому такие понятия, как «человек», «мир», «я», «внешний мир», « ...
... и других странах СНГ, а также облегчение доступа к русской и мировой культуре и науке. Таким образом, судя по данным наших исследований, востребованность русского языка осталась в республике достаточно высокой. Многие представители современной молдавской молодежи продолжают, как их отцы и деды, тянуться к русской культуре, научным и техническим достижениям России. Русский язык остается языком ...
... рисуночное словесно-слоговое письмо). Памятники среднеэламского периода (14—12 вв. до н.э.) выполнены аккадской клинописью. Памятники новоэламского периода относятся к 8—6 вв. до н.э. Был официальным языком в персидском государстве Ахеменидов в 6—4 вв. предполагается, что он, подвергшись влиянию древнеперсидского, сохранился до раннего средневековья. 7. Бурушаски язык Язык бурушаски ( ...
... /диалект), скифский, согдийский, среднеперсидский, таджикский, таджриши (язык/диалект), талышский, татский, хорезмийский, хотаносакский, шугнано-рушанская группа языков, ягнобский, язгулямский и др. Они относятся к индоиранской ветви индоевропейских языков. Области распространения: Иран, Афганистан, Таджикистан, некоторые районы Ирака, Турции, Пакистана, Индии, Грузии, Российской Федерации. Общее ...
0 комментариев