Язык Си - Уэйт, Прата, Мартин. M. уэит с. Прата д. Мартин
Скачать 4.69 Mb.
|
Тип данных unsigned Далее Содержание Обычно данный тип служит модификатором одного из трех ранее описанных типов. Поэтому мы можем использовать комбинация ключевых слов unsigned int или unsigned long как обозначения типов. Для указания типа unsigned int достаточно привести только ключевое слово unsigned. Некоторые вычислительные системы никак не обеспечивают аппаратную реализацию типа unsigned long; кроме того, существуют модели микропроцессоров в которых unsigned - специальный тип фиксированного размера. Целые беззнаковые константы записываются точно так же, как и обычные целые константы, с тем лишь исключением, что использование знака - запрещено. 39 Целые переменные без знака описываются и инициализируются совершенно аналогично тому, как это делается в случае обычных целых переменных. Ниже приведено несколько примеров: unsigned int students; unsigned players; unsigned short ribs = 6; Применение данного типа при введении в программу некоторой переменной гарантирует, что она никогда не станет отрицательной. Кроме того, если вы имеете дело только с положительными числами, вы сможете воспользоваться тем, что данные указанного типа могут принимать большие значения, чем данные эквивалентного типа со знаком. Обычно это применяется при адресации памяти и организации счетчиков. Тип данных char Далее Содержание Этот тип определяет целые числа без знака в диапазоне от 0 до 255. Обычно такое целое размещается в одном байте памяти. В машине используется некоторый код для перевода чисел в символы и обратно. В большинстве компьютеров это код ASCII, описанный в приложении в конце книги. Во многих компьютерах фирмы IBM (но не IBM PC) применяется другой код, называемый EBCDIC. На протяжении всей книги мы будем использовать код ASCII и, проведя различные примеры, будем ссылаться на него. Описание символьных переменных Далее Содержание Для описания символьной переменной применяется ключевое слово char. Правила, касающиеся описания более чем одной переменной и инициализации переменных, остаются теми же, что и для других основных типов. Поэтому строки, приведенные ниже, являются допустимыми операторами. char response; char intable, latan; char isma = ' S '; Символьные константы Далее Содержание В языке Си символы заключаются в апострофы. Поэтому, когда мы присваиваем какое-то значение переменной broiled типа char, мы должны писать broiled = ' Т '; /* ПРАВИЛЬНО */, а не broiled = Т; /* НЕПРАВИЛЬНО */ Если апострофы опущены, компилятор "считает", что мы используем переменную с именем Т, которую забыли описать. В стандарте языка Си принято правило, согласно которому значениями переменной или константы типа char могут быть только одиночные символы. В соответствии с этим последовательность операторов, указанная ниже, является недопустимой, поскольку там делается попытка присвоить переменной bovine значение, состоящее из двух символов: ehar bovine; bovine = ' ox '; /*НЕПРАВИЛЬНО */ 40 Если вы посмотрите на таблицу кода ASCII, то увидите, что некоторые из "символов" в ней не выводятся на печать. Например, при использовании в программе символа номер 7 терминал компьютера издает звуковой сигнал. Но как использовать символ, который невозможно набрать на клавиатуре? В языке Си для этого имеются два способа. В первом способе используется сам код ASCII. Вы должны только указать номер символа вместе с предшествующим знаком "обратная косая черта". Мы уже делали это в нашей программе "золотой эквивалент". Вот эта строка beep = ' \007 '; Здесь имеются два важных момента, которые вы должны отчетливо представлять себе. Первый - это то, что последовательность знаков заключается в апострофы точно так же, как это делается с обычным символом. Второе - то, что номер символа должен быть записан в восьмеричном виде. При записи последовательности знаков мы можем случайно пропустить нули в первых позициях; в этом случае для представления кода "сигнал" мы могли бы использовать '\07' или даже '\7'. Но ни в коем случае не опускайте в записи последние нули! Последовательность символов '\020' можно записать в виде '\20', но не '\02'. При использовании кода ASCII необходимо отметить различие между числами и символами, обозначающими числа. Например, символу "4" соответствует код ASCII, равный 52. Это символ "4" а не число 4. РИС. 3. 4. Формы записи констант целых типов Во втором способе представления "неудобных" знаков используются специальные последовательности символов. Они называются управляющими последовательностями и выглядят следующим образом: \n новая строка \t табуляция \b шаг назад \r возврат каретки \f подача бланка \\ обратная косая черта (\) \' апостроф (') 41 \" кавычки (") При присваивании символьной переменной эти последовательно сти тоже должны быть заключены в апострофы. Например, мы могли бы написать оператор nerf = ' \n '; а затем вывести на печать переменную nerf; это приведет к продви жению на одну строку вперед на печатающем устройстве или на экране дисплея. Первые пять управляющих последовательностей являются общепринятыми символами, предназначенными для управления работой печатающего устройства: символ "новая строка" вызывает пе реход к новой строке; символ "табуляция" сдвигает курсор или печатаюшую головку на некоторое фиксированное число позиций 5 или 8; символ "шаг назад" производит сдвиг назад на одну позицию; символ "возврат каретки" осуществляет возврат к началу строки; символ "подача бланка" вызывает протяжку бумаги на одну страницу. В последних трех управляющих последовательностях символы \, ', " можно считать символьными константами [поскольку они служат для определения символьных констант и непосредственно используются в операторе printf( ), применение их самих в качестве символов могло бы привести к ошибке]. Если вы хотите вывести на печать строку. Заломните, " символ \ называется обратная косая черта". оператор будет выглядеть так: printf(" Запомните, \" символ \\ называется обратная косая черта. \" \n"); Здесь у вас могут возникнуть два вопроса. Во-первых, почему мы не заключили управляющие последовательности в апострофы? Во-вторых, в каких случаях необходимо использовать код ASCII и когда управляющие последовательности, которые мы только что обсуждали? (Мы надеемся, что у вас возникли как раз эти вопросы, ПОТОМУ что мы собираемся отвечать именно на них.) 1. Когда символ является частью строки символов, заключенной в кавычки, он входит туда без апострофов независимо от того, является ли он управляющим или нет. Заметим, что все остальные символы в нашем примере (3,а, п, о, м, н, и т. д.) тоже присутствуют в этой строке без кавычек. Строка символов, заключенная в кавычки, называется символьной строкой или цепочкой. Мы обсудим этот вопрос в следующей главе. 2. Если у вас есть возможность выбора одной из двух форм записи некоторой специальной управляющей последовательности, скажем '\f', или эквивалентного кода из таблицы кодов ASCII - '\016', то рекомендуем использовать '\f'. Во-первых, это более наглядно. Во-вторых, лучше согласуется с требованием переносимости программ, поскольку даже в том случае, когда в системе не используется код ASCII, обозначение '\f' будет продолжать "работать". Программа Далее Содержание Ниже приводится короткая программа, позволяющая узнавать номер кода символа даже в том случае, если на вашей машине не используется код ASCII. main( ) /* определяет номер кода символа */ { char ch; printf(" Введите, пожалуйста, символ .\n"); scanf(" %c", &ch); /* ввод пользователем символа */ printf("Koд символа %с равен %d.\n", ch, ch); } 42 При работе с этой программой не забывайте нажимать клавишу [ввод] или [возврат] после ввода символа. Затем функция scanf( ) прочтет введенный символ; знак амперсанд (&) указывает, что символ должен быть присвоен переменной ch. Функция printf( ) выводит на печать величину ch дважды: первый раз как символ (в соответствии со спецификацией %c), а затем как десятичное целое число (в соответствии со спецификацией %d). Типы данных float и double Далее Содержание В большинстве проектов разработки программного обеспечения оказывается вполне достаточным использовать данные целых типов. Однако в программах вычислительного характера часто применяются числа с плавающей точкой. В языке Си такие данные описываются типом float; они соответствуют типу real в Фортране и Паскале. Указанный подход, как вы могли заметить при вни мательном чтении, позволяет представлять числа из гораздо более широкого диапазона, включая и десятичные дроби. Числа с плавающей точкой совершенно аналогичны числам в обычной алгебраической записи, используемой при работе с очень большими или малыми числами. Давайте рассмотрим ее подробнее. Алгебраическая запись числа представляет собой произведение некоторого десятичного числа на степень, основание которой равно десяти. Ниже приведено несколько примеров. Число Алгебраическая запись для ввода запись в машину 1 000000000 = 1.0 ґ 10 9 = 1.0e9 123000 = 1.23 ґ 10 5 = 1.23е5 322.56 = 3.2256 ґ 10 2 = 3.2256е2 0.000056 = 5.6 ґ 10 -5 = 5.6е-5 В первом столбце числа изображены в обычной записи, во втором приведена соответствующая алгебраическая запись, а в третьем столбце числа показаны в том виде, в котором они обычно представляются при вводе в машину и при выводе из нее - с символом е, за которым следует показатель степени по основанию десять (порядок). Обычно для размещения в памяти числа с плавающей точкой отводится 32 бита - 8 бит для представления порядка и знака и 24 бита - для мантиссы (т. е. коэффициента при степени десяти). Важным фактом, который вам необходимо знать, является то, что такой способ дает возможность представлять числа с точностью до 6-7 десятичных цифр в диапазоне ±(10 -37 - 10 38 ). Это может оказаться удобным, если вам понадобится обрабатывать числа того же порядка, что масса Солнца (2.0е30 кг) или заряд протона (1.6е-19 Кл). (Многим нравится использовать подобные числа.) Во многих ЭВМ предусматривается обработка данных типа double (вычислений с двойной точностью), когда для представления чисел используется удвоенное число битов, чаще всего 64. В некоторых машинах все 32 добавочных бита используются для хранения мантиссы. Это увеличивает число значащих цифр и уменьшает ошибку округления. В других машинах некоторое число битов из дополнительного набора используется для хранения большего порядка: это расширяет диапазон представления чисел. Другой способ определения данных типа double заключается в использовании ключевых слов long float. 43 РИС. 3.5. Примеры чисел с плавающей точкой. Описание переменных с плавающей точкой Далее Содержание Переменные с плавающей точкой описываются и инициализируются точно таким же образом, что и переменные целого типа. Ниже приведено несколько примеров: float noah, jonah; double trouble; float planck = 6.63e- 34; Константы с плавающей точкой Далее Содержание Правила языка Си допускают несколько способов записи констант с плавающей точкой. Наиболее общая форма записи константы - это последовательность десятичных цифр со знаком, включающая в себя десятичную точку, затем символ е или Е и показатель степени по основанию 10 со знаком. Вот два примера: -1.56Е+12 2.87е-3 Знак + можно не писать. Разрешается также опускать либо десятичную точку, либо экспоненциальную часть, но не одновременно. Кроме того, можно не писать дробную или целую часть, но не обе сразу. Ниже приведено еще несколько правильно записанных констант с плавающей точкой: 3.14159 .2 4е16 .8Е-5 100. Использовать пробелы при записи констант запрещается 1.56Е+ 12 - НЕПРАВИЛЬНО В процессе обработки константы с плавающей точкой рассматриваются в формате с удвоенной точностью. Предположим, например, что переменная some типа float получает свое значение в результате выполнения оператора some = 4.0*2.0; В этом случае константы 4.0 и 2.0 размещаются в памяти как данные типа double, т. е. для 44 каждой из них (обычно) отводится 64 бит. Их произведение (равное 8) вычисляется с помощью операции умножения, выполняемой с двойной точностью, и только после этого производится усечение результата до нормального размера, соответствующего типу float. Все это обеспечивает максимальную точность ваших вычислений. Переполнение и потеря значимости при обработке чисел с плавающей точкой Что произойдет, если значение переменной типа float выйдет за установленные границы? Например, предположим, что вы умножаете 10е38 на 100 (переполнение) или делите 10е - 37 на 1000 (потеря значимости). Результат целиком зависит от реакции вашей вычислительной системы. В нашей системе при возникновении состояния "переполнение" результат операции заменяется максимально допустимым числом, а при потере значимости - нулем. В других системах в подобной ситуации могут выдаваться предупреждающие сообщения, выполиение задачи можно приостановить, или вам будет предоставлена возможность предпринять что-нибудь самому. Если этот вопрос окажется для вас сушественным, вам необходимо будет свериться с правилами, действующими для вашей ЭВМ. В случае если вы не сможете найти никакой информации, не бойтесь пробовать другие возможности. Резюме: основные типы данных Ключевые слова Данные основных типов вводятся в программу при помощи следующих семи ключевых слов: int, long, short, unsigned, char, float, double. ЦЕЛЫЕ ЧИСЛА СО ЗНАКОМ Данные этих типов могут принимать положительные и отрицательные значения. int: основной целый тип, используемый в вычислительной системе; long или long int: может содержать целое значение, не меньшее максимальной величины, допускаемой типом int, или даже большее; short или short int: максимальное целое число типа short не больше, чем максимальное целое число типа int, а может быть, и меньше. Обычно числа типа long бывают больше чисел типа short, а тип int реализуется как один из двух указанных типов. Например, компилятор Lattice С на IBM PC под данные типов short и int отводит 16 бит, а под данные типа long - 32 бита. Все зависит от конкретной системы. ЦЕЛЫЕ ЧИСЛА БЕЗ ЗНАКА Данные этих типов принимают только положительные значения или нуль. Это расширяет диапазон возможных положительных значений. При указании типа используйте ключевое слово unsigned: unsigned int, unsigned long, unsigned short. Просто unsigned соответствует написанию unsigned int. СИМВОЛЫ Эти знаки соответствуют типографским символам, таким, как А, &, + и т. п. Обычно под каждый символ отводится 1 байт памяти. Char: ключевое слово, используемое для указания данных этого типа. 45 Данные этих типов могут принимать положительные и отрицательные значения. float: основной тип данных с плавающей точкой в системе; double или long float при размещении в памяти чисел с плавающей точкой такого типа отводится (возможно) элемент памяти большего размера; при этом может допускаться либо большее число значащих цифр, либо большее значение порядка. Резюме: как описывать простые переменные 1. Выбрать требуемый тип данных. 2. Выбрать имя для переменной. 3. Для оператора описания использовать нижеследующий формат: спецификация-типа имя-переменной; Спецификация-типа формируется из одного или более ключевых слов. Вот несколько примеров: int erest; unsigned short cash; 4. Вы можете описать в одном операторе несколько переменных одного типа, разделяя их имена запятыми: char ch, unit, ans; 5. В операторе описания вы имеете возможность инициализировать переменную: float mass = 6.0E24; Другие типы Далее Содержание Этот раздел завершает рассмотрение основных типов данных. Некоторым читателям их число может показаться слишком большим. Остальные могут полагать, что описанных типов недостаточно; например, им захочется иметь булев тип или строковый тип данных. В языке Си они отсутствуют, но, несмотря на это, он вполне подходит для написания программ, связанных с обработкой логических данных или строк. Самые простые возможности работы со строками мы рассмотрим в следующей главе. В языке Си имеются и другие типы данных, построенные с использованием основных типов. Они включают в себя массивы, указатели, структуры и объединения. Хотя эти типы являются пред метом рассмотрения последующих глав, мы, не подозревая об этом, уже применили указатели в примерах, приведенных в данной главе. [Указатели используются функцией scanf( ); признаком этого в данном случае служит префикс &.] 46 РИС. 3.6. Реализация типов данных языка Си в обычной вычислительной системе. Размеры данных Далее Содержание Приведем таблицу размеров данных для некоторых распространенных вычислительных систем. Таблица 3.1. 47 Представление типов данных в некоторых известных вычислительных системах Размер слова DEC PDP-11 16 бит DEC VAX 32 бита Interdata 8/3 32 бита IBM PC (Lattice C) 16 бит char 8 8 8 8 int 16 32 32 16 short 16 16 16 16 long 32 32 32 32 float 32 32 32 32 double 64 64 64 64 Диапазон порядка ±38 ±38 ±76 -307 ё 308 (double) 48 Как обстоит дело на вашей машине? Попробуйте выполнить нижеследующую программу: main( ) { printf(" Данные типа int занимают %d байта. \n", sizeof (int)); printf(" Данные типа char занимают %d байт.\n", sizeof (char)); printf(" Данные типа long занимают %d байта.\n", sizeof (long)); printf(" Данные типа double занимают %d байт.\n", sizeof (double)); } В языке Си имеется встроенная операция sizeof, которая позволяет определить размер объектов в байтах. Мы определили размеры данных только четырех типов, но вы легко можете модифицировать эту программу и найти размер объекта любого другого интересующего вас типа. |