some = 4.0*2.0;
В этом случае константы 4.0 и 2.0 размещаются в памяти как данные типа double, т. е. для каждой из них (обычно) отводится 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: ключевое слово, используемое для указания данных этого типа.
Данные этих типов могут принимать положительные и отрицательные значения.
float: основной тип данных с плавающей точкой в системе;
1. Выбрать требуемый тип данных.
2. Выбрать имя для переменной.
3. Для оператора описания использовать нижеследующий формат:
спецификация-типа имя-переменной;
Спецификация-типа формируется из одного или более ключевых слов.
Вот несколько примеров:
int erest;
unsigned short cash;
4. Вы можете описать в одном операторе несколько переменных одного типа, разделяя их имена запятыми:
char ch, unit, ans;
5. В операторе описания вы имеете возможность инициализировать переменную:
float mass = 6.0E24;
Другие типы
Этот раздел завершает рассмотрение основных типов данных. Некоторым читателям их число может показаться слишком большим. Остальные могут полагать, что описанных типов недостаточно; например, им захочется иметь булев тип или строковый тип данных. В языке Си они отсутствуют, но, несмотря на это, он вполне подходит для написания программ, связанных с обработкой логических данных или строк. Самые простые возможности работы со строками мы рассмотрим в следующей главе.
В языке Си имеются и другие типы данных, построенные с использованием основных типов. Они включают в себя массивы, указатели, структуры и объединения. Хотя эти типы являются пред метом рассмотрения последующих глав, мы, не подозревая об этом, уже применили указатели в примерах, приведенных в данной главе. [Указатели используются функцией scanf( ); признаком этого в данном случае служит префикс &.]
Приведем таблицу размеров данных для некоторых распространенных вычислительных систем.
Таблица 3.1. Представление типов данных в некоторых известных вычислительных системах
Размер слова 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) Как обстоит дело на вашей машине? Попробуйте выполнить нижеследующую программу:
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, которая позволяет определить размер объектов в байтах.
Мы определили размеры данных только четырех типов, но вы легко можете модифицировать эту программу и найти размер объекта любого другого интересующего вас типа.
ИСПОЛЬЗОВАНИЕ ТИПОВ ДАННЫХ
Во время разработки программы вам необходимо составить список требуемых переменных и указать при этом, какого они должны быть типа. Скорее всего вы будете использовать тип int или, возможно, float для определения чисел и тип char для символов. Описывайте эти данные в самом начале тела функции, в которой они используются. Имена переменных выбирайте таким образом, чтобы они указывали на их смысл. При инициализации переменной следите за тем, чтобы тип константы соответствовал типу переменной.
int apples = 3; /* ПРАВИЛЬНО */
int oranges = 3.0; /* НЕПРАВИЛЬНО */
Язык Си "рассматривает" такие несоответствия менее жестко, чем, скажем, Паскаль, но в любом случае лучше учиться избегать дурных привычек.
ЧТО ВЫ ДОЛЖНЫ БЫЛИ УЗНАТЬ В ЭТОЙ ГЛАВЕ
В данной главе мы рассмотрели довольно большой материал. Суммируя его, мы обратим основное внимание на практическую сторону тех вопросов, которые здесь обсудили. Так же как и в предыдущей главе, мы дадим краткие примеры. Ниже приводится сводка тех фактов, которые вы должны были узнать из этой главы.
Что такое основные типы данных языка Си: int, short, long, unsigned, char, float, double.
Как описать переменную любого типа: int beancount, float root-beer; и т. д.
Как зависать константу типа int: 256, 023, OXF5 и т. д.
Как записать константу типа char: 'r', 'U', ' 07', '?' и т. д.
Как записать константу типа float: 14,92, 1.67е-27 и т. д.