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 и т. д.