M. УЭИТ - Язык Си - руководство для начинающих
Второй: целое, начинающееся с символом 0х или 0Х интерпретируется как шестнадцатеричное число, т. е. число, записываемое по основанию 16. Поэтому запись 0х20 представляет собой удвоенную первую степень числа 16, или 32.
Восьмеричные и шестнадцатеричные числа чрезвычайно популярны среди программистов. Поскольку 8 и 16 являются степенями числa 2, а 10 - нет, использование этих систем счисления при работе на машине является вполне естественным. Например, число 65536, которое часто возникает при программировании на 16-разрядных компьютерах, в шестнадцатеричной записи имеет вид 10000. Если вы захотите больше узнать о восьмеричных и шестнадцатеричных числах, вы сможете найти дополнительный материал в приложении Ж.
Инициализация переменных целого типа
Константы часто применяются при "инициализации" переменных. Это означает присваивание переменной некоторого значения перед началом обработки. Ниже приводятся примеры использования инициализации:
erns = 1024;
stops = -3;
johns = 12345678;
Если захотите, вы можете инициализировать переменную в операторе описания. Например:
int hogs = 23;
int cows = 32, goats = 14;
short dogs, cats = 92;
Заметим, что в последней строке была инициализирована только переменная cats. При невнимательном чтении может создаться впечатление, что переменная dogs тоже инициализирована значением 92, поэтому лучше избегать смешивания инициализируемых и неинициализируемых переменных в одном операторе описания.
Рекомендации
Какие переменные целого типа со знаком лучше всего использо вать? Одной из целей введения в язык трех классов целых чисел, имеющих различные размеры, было предоставить возможность согласования типа переменной с требованиями задачи. Например, если переменная типа int занимает одно слово, а переменная типа long - два, то тип long позволяет обрабатывать большие числа. Если в вашей задаче такие большие числа не используются, то незачем и вводить в программу переменную типа long, так как, если вместо числа, занимающего одно слово памяти, используется число, занимающее два слова, работа машины замедляется. Вообще говоря, необходимость введения данных типа long целиком зависит от вашей вычислительной системы, поскольку под данные типа int на одной машине может отводиться больше памяти, чем под данные типа long на другой. В конце мы еще раз хотим напомнить вам, что обычно вполне достаточно использовать переменную типа int.
Что происходит, когда в процессе обработки данных появляется значение, лежащее вне того диапазона чисел, которому соответствует данный целый тип? Давайте присвоим некоторой переменной целого типа наибольшее возможное значение, выполним операцию сложения и посмотрим, что произойдет
/* переполнение */
main( )
{
int i = 32767,
printf( %d %d %dn , i, i+l, i+2),
}
Ниже приведен результат работы этой программы, выполненной на нашей вычислительной системе
3
Целая переменная i ведет себя здесь как одометр2) в машине. Когда его показания достигают максимума, данная величина "сбрасывается", и все начинается сначала. Основное отличие состоит в том, что показания одометра растут, начиная с нуля, а значения нашей переменной типа int - с величины - 32768.
Заметим, что при этом вам не сообщают, что переменная i превысила максимальное значение Для регистрации подобных событий вы должны использовать свои программные средства.
Описанный подход не вытекает непосредственно из правил языка Си, а является довольно распространенным способом реализации.
Тип данных unsigned
Обычно данный тип служит модификатором одного из трех ранее описанных типов. Поэтому мы можем использовать комбинация ключевых слов unsigned int или unsigned long как обозначения типов. Для указания типа unsigned int достаточно привести только ключевое слово unsigned. Некоторые вычислительные системы никак не обеспечивают аппаратную реализацию типа unsigned long; кроме того, существуют модели микропроцессоров в которых unsigned - специальный тип фиксированного размера.
Целые беззнаковые константы записываются точно так же, как и обычные целые константы, с тем лишь исключением, что использование знака - запрещено.
Целые переменные без знака описываются и инициализируются совершенно аналогично тому, как это делается в случае обычных целых переменных. Ниже приведено несколько примеров:
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 '; /*НЕПРАВИЛЬНО */
Если вы посмотрите на таблицу кода ASCII, то увидите, что некоторые из "символов" в ней не выводятся на печать. Например, при использовании в программе символа номер 7 терминал компьютера издает звуковой сигнал. Но как использовать символ, который невозможно набрать на клавиатуре? В языке Си для этого имеются два способа.
В первом способе используется сам код ASCII. Вы должны только указать номер символа вместе с предшествующим знаком "обратная косая черта". Мы уже делали это в нашей программе "золотой эквивалент". Вот эта строка
beep = ' 07 ';
Здесь имеются два важных момента, которые вы должны отчетливо представлять себе. Первый - это то, что последовательность знаков заключается в апострофы точно так же, как это делается с обычным символом. Второе - то, что номер символа должен быть записан в восьмеричном виде. При записи последовательности знаков мы можем случайно пропустить нули в первых позициях; в этом случае для представления кода "сигнал" мы могли бы использовать ' 7' или даже '7'. Но ни в коем случае не опускайте в записи последние нули! Последовательность символов ' 20' можно записать в виде '20', но не ' 2'.
При использовании кода ASCII необходимо отметить различие между числами и символами, обозначающими числа. Например, символу "4" соответствует код ASCII, равный 52. Это символ "4" а не число 4.
РИС. 3. 4. Формы записи констант целых типов