Васин Д.Ю. - Язык программирования Си. Курс лекций - 2003. Руководство для начинающих. М. Мир, 1988г. 512 с. Трой Д. Программирование на языке Си для персонального компьютера ibm pc Пер с англ. М. Радио и связь, 1991г. 432 с
Скачать 1.1 Mb.
|
4.4 Работа с числовыми даннымиСовременные представления о числовых данных базируются на так называемых позиционных системах счисления. Для этих систем характерно основание системы p, степень которого определяет вес цифры a (a=0,1,2,...,p-1) в зависимости от занимаемой позиции: ak ak-1 ...a1 a0,b-1 b-2 ... b-m = ak*pk + ak-1*pk-1 + ... + a1*p1 + a0*p0 + b-1*p-1 + b-2*p-2 + ... + b-m*p-m Главенствующую роль в человеческом общении играет десятичная система счисления (p = 10; a = 0,1,...,9). Однако ЭВМ используют более рациональную двоичную систему (p = 2; a = 0,1). Единственным ее недостатком является большая длина чисел. Количество разрядов (цифр) в двоичном представлении числа примерно в 3 раза превышает количество десятичных цифр. И для преодоления этого неудобства программисты прибегают к более компактной записи двоичных кодов в виде восьмеричных или шестнадцатеричных чисел. При этом три или четыре смежные двоичные цифры заменяют одной восьмеричной или шестнадцатеричной цифрой. Например: 19210 = 110000002 110000002 = 3008 110000002 = C016 4.4.1. Внешнее и внутреннее представление числовых данныхПод внешним представлением числовой информации мы подразумеваем способы записи данных, используемые в текстах программ, при наборе чисел, вводимых в ЭВМ по запросу программы, при отображении результатов на экране дисплея или на принтере. Кроме естественного представления числовых констант в виде целого или вещественного числа языки программирования допускают различные добавки в начале ("префиксы") или конце ("суффиксы") числа, определяющие способы преобразования и хранения данных в памяти компьютера. В Си к таким суффиксам относятся указания об удвоенной длине целых чисел (буквы L или l), указания о вещественном формате числа, не содержащего в своей записи десятичной точки или десятичного порядка (буква F или f), указания об использовании без знакового представления целых чисел (буква U или u). Префиксы в Си используются для записи восьмеричных (число начинается с 0) или шестнадцатеричных (числу предшествует одна из комбинаций 0x или 0X) констант: 5 – короткое целое число со знаком; 5U – короткое целое число без знака; 5L – длинное целое число со знаком; 5LU или 5UL – длинное целое число без знака; 05 – восьмеричное число; 0x5 – шестнадцатеричное число; 5f – вещественное число со знаком. Наличие в естественной записи числа точки (3.1415) или указателя десятичного порядка (314.159265e-02) означает, что соответствующее значение представлено в ЭВМ в виде вещественного числа с плавающей запятой. Машинные форматы представления чисел мы будем называть внутренними и из приведенных ранее примеров следует, что машинные числа бывают целыми и вещественными. В свою очередь, каждый из этих типов данных допускает несколько представлений, отличающихся диапазоном допустимых чисел. Остановимся более подробно на машинных форматах числовых данных, соответствующих их аналогам в алгоритмических языках. Самые короткие числа со знаком представлены в памяти ЭВМ одним байтом, в котором может разместиться любое число из диапазона от -128 до 127. В Си для описания данных такого типа используется спецификатор char. В одном же байте может быть расположено и самое короткое целое число без знака. В Си для описания таких данных служит спецификатор unsigned char. Диапазон допустимых данных при этом смещается вправо и равен [0, 255]. Вторая категория целых чисел представлена двухбайтовыми данными. В варианте со знаком они предлагают диапазон от -32768 до +32767, в варианте без знака - от 0 до 65535. Си использует для описания двухбайтовых целочисленных данных спецификаторы int и unsigned int, корректно выполняя арифметические операции и с без знаковыми данными при условии, что результат не выходит за пределы разрешенного диапазона. Третья категория целых чисел в IBM PC представлена четырехбайтовыми данными. В варианте со знаком они перекрывают диапазон от -2147483648 до +2147483647, в варианте без знака - от 0 до 4294967295. Для описания четырехбайтовых данных целого типа в Си используются спецификаторы long (эквивалент long int) и unsigned long. Следует помнить, что для хранения любых целых чисел со знаком в IBM PC используется дополнительный код, что сказывается на представлении отрицательных чисел: +5 = 0 0000101 = 0 000000000000101 –5 = 1 1111011 = 1 111111111111011 Наиболее часто применяемые типы вещественных чисел представлены короткими (4 байта) и длинными (8 байт) данными. Си использует для этой цели спецификаторы float и double. Короткий вещественный формат по модулю обеспечивает представление чисел в диапазоне от 10-38 до 10+38 примерно с 7-8 значащими цифрами. Для 8-байтового формата диапазон существенно расширяется –от 10-308 до 10+308, а количество значащих цифр увеличивается до 15-16. Сопроцессор IBM PC предлагает еще два формата данных, занимающих соответственно 8 и 10 байт. Первый из них допускает работу с целыми числами из диапазона от –263 до 263-1. Второй формат перекрывает диапазон данных (по модулю) от 10-4932 до 10+4932, сохраняя 19-20 значащих цифр. Расширенный формат вещественных данных можно использовать и в программах на Си (long double). В машинном представлении вещественных данных разного типа на IBM PC не выдержана какая-то общая идеология. Объясняется это, по всей вероятности, разными наслоениями на прежние аппаратные решения, которые принимались при разработке процессоров в разных отделениях фирмы Intel. Поэтому здесь имеют место такие нюансы как сохранение или не сохранение старшего бита мантиссы, представление мантиссы в виде чисто дробного (0.5 = m < 1) или смешанного (1 = m < 2) числа и т.п. Прикладных программистов эти детали мало интересуют, однако при создании специальных системных компонент с точным представлением данных приходится считаться. 4.4.2. Ввод числовой информацииКаких-либо особых проблем с вводом числовой информации в программах не возникает. В Си основные неприятности форматного ввода (функция scanf) связаны с попыткой указать в списке вода не адрес переменной, а ее имя: scanf("%d",x); //правильно было бы scanf("%d",&x); Компилятор TC/BC такую ошибку, к сожалению, не замечает и преобразует имя x в какой-то фантастический адрес. Последующую работу программы в этом случае предсказать трудно. Не обращает внимания компилятор Си и на несоответствие между спецификатором формата и типом переменной из списка ввода. Всего этого можно избежать используя потоковый ввод: cin >> x; 4.4.3. Вывод числовых результатовНаиболее приятный вид имеет числовая информация, организованная по табличному типу – в виде колонок фиксированной ширины, в которых одноименные числовые разряды располагаются друг под другом (единицы под единицами, десятки под десятками сотни под сотнями и т.д.). При этом, в частности, более рационально используется площадь экрана. Достигается такая красота за счет управления форматами выводимых данных. В Си для этой цели используется функция printf: printf("A=%6.3f B=%3d C=%10.4e",A,B,C); При выводе в поток, когда к Си-программе подключаются заголовочные файлы iostream.h и iomanip.h, тоже имеется возможность управлять форматом выводимых данных: cout << "A=" << setw(6) << setprecision(5) << A; Среди форматных спецификаторов в Си есть дополнительные возможности, обеспечивающие вывод числовых данных не только в десятичной системе: printf("%4x %6o",x,y); Приведенные здесь спецификаторы позволяют вывести значения целочисленных переменных x и y, соответственно, в виде шестнадцатеричного числа с четырьмя цифрами и восьмеричного числа с шестью цифрами. Си позволяет прижимать выводимое число к левой границе отведенного поля (по умолчанию действует правый прижим), печатать знак "+" у положительных чисел, подавлять или разрешать вывод незначащих нулей и др. Подробную информацию о структуре форматного описателя можно найти в файлах помощи системы Borland С++. |