Интерпретация идентификаторов

С каждым идентификатором в Си связано два атрибута: егокласс памяти и его тип. Класс памяти определяет место ивремя хранения памяти, связанной с идентификатором; типопределяет смысл величин, находящихся в памяти, определеннойпод идентификатором. Имеются четыре класса памяти: автоматическая, статичес-кая, внешняя и регистровая. Автоматические переменные явля-ются локальными для каждого вызова блока и исчезают привыходе из этого блока. Статические переменные являютсялокальными, но сохраняют свои значения даже после того, какуправление передается за пределы блока. Внешние переменныесуществуют и сохраняют свои значения в течение выполнениявсей программы и могут использоваться для связи между функ-циями, в том числе и между независимо скомпилированнымифункциями. Регистровые переменные хранятся (если это воз-можно) в быстрых регистрах машины; подобно автоматическимпеременным они являются локальными для каждого блока и исче-зают при выходе из этого блока. В языке Си предусмотрено несколько основных типовобъектов: -6- Символьный. - Объекты, описанные как символы (char), достаточно велики, чтобы хранить любой член из соответствующего данной реализации внутреннего набора символов, и если действительный символ из этого набора символов хра- нится в символьной переменной, то ее значение эквива- лентно целому коду этого символа. В символьных пере- менных можно хранить и другие величины, но реализация будет машинно-зависимой. (На СМ ЭВМ значение символь- ных переменных изменяется от -0177 до 0177.) Целый. - Можно использовать до трех размеров целых, описывае- мых как short int, int и long int. Длинные целые занимают не меньше памяти, чем короткие, но в конк- ретной реализации может оказаться, что либо короткие целые, либо длинные целые, либо те и другие будут эквивалентны простым целым. "Простые" целые имеют естественный размер, предусматриваемый архитектурой используемой машины; другие размеры вводятся для удовлетворения специальных потребностей. Беззнаковый. - Целые без знака, описываемые как unsigned, подчиня- ются законам арифметики по модулю 2**n, где n - число битов в их представлении. (На CM-ЭВМ длинные вели- чины без знака не предусмотрены). Вещественный. - Вещественные одинарной точности (float) и веществен- ные двойной точности (double) в некоторых реализациях могут быть синонимами. (На СМ ЭВМ float занимает 32 бита памяти, а double - 64). В языке нет логического типа данных, а в качестве логическихзначений используются целые "0" - "ложь" и "1" - "истина"(при проверках любое целое, не равное 0, трактуется как"истина"). Поскольку объекты упомянутых выше типов могут бытьразумно интерпретированы как числа, эти типы будут назы-ваться арифметическими. Типы char и int всех размеров сов-местно будут называться целочисленными. Типы float и double совместно будут называться вещественными типами. Кроме основных арифметических типов существует концеп-туально бесконечный класс производных типов, которые образу-ются из основных типов следующим образом: - массивы объектов большинства типов; - функции, которые возвращают объекты заданного типа; -7- - указатели на объекты данного типа; - структуры, содержащие последовательность объектов различных типов; - объединения, способные содержать один из нескольких объектов различных типов. Вообще говоря, эти методы построения объектов могутприменяться рекурсивно.

Объекты и l_значения

Объект является доступным обработке участком памяти;l_значение (левое значение) - это выражение, ссылающееся наобъект. Очевидным примером выражения l_значения являетсяидентификатор. Существуют операции, результатом которыхявляются l_значения; если, например, e - выражение типа ука-затель, то *e является выражением l_значения, ссылающимся натот объект, на который указывает е. Название "l_значение"происходит от выражения присваивания e1 = e2, в котором леваячасть должна быть выражением l_значения. При последующемобсуждении каждой операции будет указываться, ожидает ли онаоперандов l_значения и выдает ли она l_значение.

Преобразования

Ряд операций может в зависимости от своих операндоввызывать преобразование значения операнда из одного типа вдругой. В этом разделе объясняются результаты, которые сле-дует ожидать от таких преобразований. В конце подводятсяитоги преобразований, требуемые большинством обычных опера-ций; эти сведения дополняются необходимым образом при обсуж-дении каждой операции.

Символы и целые

Символ или короткое целое можно использовать всюду, гдеможно использовать целое. Во всех случаях значение преобра-зуется к целому. Преобразование более короткого целого кболее длинному всегда сопровождается знаковым расширением;целые являются величинами со знаком. Осуществляется или нетзнаковое расширение для символов, зависит от используемоймашины, на СМ-ЭВМ такое преобразование осуществляется так,что русские буквы при прямом преобразовании получат отрица-тельные коды. Область значений символьных переменных наCM-ЭВМ меняется от -128 до 127; символы из набора ASCIIимеют положительные значения. Символьная константа, задан-ная с помощью восьмеричной условной последовательности, под-вергается знаковому расширению и может оказаться отрицатель-ной; например, ' \ 377' имеет значение -1. -8- Когда более длинное целое преобразуется в более корот-кое или в char, оно обрезается слева; лишние биты простоотбрасываются.

Типы float и double

Вся вещественная арифметика в Си выполняется с двойнойточностью. Каждый раз, когда объект типа float появляется ввыражении, он удлиняется до double посредством добавлениянулей в его дробную часть. Когда объект типа double долженбыть преобразован к типу float, например, при присваивании,перед усечением double округляется до длины float. Единственное исключение может быть сделано в компилято-рах для ЭВМ, на которых нет аппаратных операций над числамитипа double (например, СМ-4). Уточнить это можно по описа-нию компилятора (команда cc).

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: