Попробуйте часть кода до слова main заменить на #include "stdafx.h" //1 #include <iostream> //2 using namespace std; //3 |
Системные данные числового типа
Основным назначением любой прикладной программы является преобразование исходных данных в соответствии с заданным алгоритмом, а большая часть исходных данных обычно представлена числовой информацией. В этом разделе мы познакомимся с формой записи числовых данных в программах на языках C, C++ и набором операций, которые можно использовать для различных типов числовых данных. Термин системные, использованный в заголовке раздела, означает, что данные этого типа являются "родными" для системы программирования. Их не надо описывать, не надо определять, как выполняются арифметические или какие- либо другие операции над данными этих типов. Иногда такие данные называют базовыми. Как правило, системные типы данных в алгоритмических языках повторяют те числовые форматы, которые предусмотрены системой машинных команд ПК.
3.1. Типы числовых данных и их представление в памяти ЭВМ
Числовые данные условно можно разбить на три категории - положительные целочисленные данные (их значения в компьютере представлены целыми двоичными числами без знака), произвольные целочисленные данные (один из двоичных разрядов их представления играет роль знакового разряда) и числовые данные вещественного типа.
3.1.1. Внутреннее представление целочисленных данных
Для хранения целочисленных данных со знаком в IBM PC используется дополнительный двоичный код. Эта особенность распространяется только на отрицательные числа. Для получения дополнительного кода отрицательного числа нужно перевернуть все двоичные разряды соответствующего положительного числа и прибавить единицу в старший разряд. Например:
Дополнительный код позволяет примерно на 25% ускорить выполнение таких операций как сложение и вычитание.
3.1.2. Однобайтовые целочисленные данные
Самые короткие целочисленные данные со знаком представлены в памяти IBM-совместимых ПК одним байтом, в котором может разместиться любое число из диапазона от -128 до 127, записанное в дополнительном коде. В языках C, C++ для описания переменных такого типа используется спецификатор char. В одном же байте может быть расположено и самое короткое целое число без знака. По терминологии C таким числам соответствует спецификатор unsigned char. Диапазон допустимых данных при этом смещается вправо и равен [0, 255].
3.1.3. Двухбайтовые целочисленные данные
Вторая категория целочисленных данных в системах программирования, эксплуатируемых на IBM PC, представлена двухбайтовыми целыми числами. В варианте со знаком они поддерживают диапазон от -32768 до +32767, в варианте без знака - от 0 до 65535.
Язык системы BC 3.1 использует для описания двухбайтовых целочисленных данных спецификаторы int (короткое целое со знаком) и unsigned int (короткое целое без знака). При их использовании арифметические операции над короткими операндами выполняются корректно при условии, что результат не выходит за пределы разрешенного диапазона. Однако если к максимальному целому числу прибавить 1, то вместо положительного числа +32768 в компьютере окажется отрицательное число -32768. И никакого предупреждения о нарушении допустимого интервала система не выдаст. Считается, что программист сам должен позаботиться о соответствующих проверках. В версии Borland C++ Builder для объявления двухбайтовых целочисленных данных используются спецификаторы short и unsigned short.
3.1.4. Четырехбайтовые целочисленные данные
Третья категория целых чисел в IBM PC представлена четырехбайтовыми данными. В варианте со знаком они перекрывают диапазон от -2147483648 до +2147483647, в варианте без знака - от 0 до 4294967295.
Для описания четырехбайтовых данных целого типа в языках C, C++ используются спецификаторы long (эквивалент long int ) и unsigned long. В среде визуального программирования C++ Builder спецификаторы int и long эквивалентны.
3.1.5. Восьмибайтовые целочисленные данные
Несмотря на то, что микропроцессоры IBM PC уже давно поддерживают восьмибайтовый целочисленный формат, обеспечивающий диапазон от -263 до 263-1, системы программирования довольно долго обходили этот формат или использовали его особым образом. Так, например, системы Turbo Pascal на базе этого формата предложили тип данных comp, который был причислен к разряду данных вещественного типа. В современных визуальных средах этот тип данных в своем естественном виде представляет числовые объекты типа int64. В недалеком будущем системы программирования воспользуются и сверхдлинными целочисленными данными типа int128.
3.2. Внутреннее представление данных вещественного типа
Для внутреннего представления данных вещественного типа характерно то, что в соответствующей области оперативной памяти хранятся две компоненты числа - мантисса m и порядок p. Само число x при этом равно произведению m*2p. Таким образом, мантисса определяет значащие цифры числа и его знак, а порядок - положение запятой, которая благодаря этому как бы "плавает" между значащими цифрами (отсюда и термин - формат с плавающей запятой ). Такой способ представления числовых данных позволяет при одинаковом количестве двоичных разрядов, отведенных для хранения чисел существенно расширить диапазон допустимых данных.
Попробуем оценить тот выигрыш в диапазоне допустимых чисел, который обеспечивает формат вещественных данных по сравнению с целочисленным форматом. Рассмотрим 32-битные двоичные числа. Целочисленные значения со знаком в этом формате позволяют работать с числами, принадлежащими по модулю интервалу [0, 2*109]. Предположим, что для числа с плавающей запятой в 32-битном слове отведены 1 двоичный разряд под знак числа, 8 двоичных разрядов под порядок и оставшиеся 23 разряда - под мантиссу. Тогда минимально представимое число равно произведению минимальной мантиссы ( 2-1 ) на минимальный порядок ( 2-128 ), т.е. 2-129, что примерно соответствует 10-39. Самое большое по модулю число представляет произведение (1-2-23)*2+127, что примерно соответствует 10+38. Таким образом, если целые числа перекрывали диапазон в 9 десятичных порядков, то формат с плавающей запятой при той же разрядности слова перекрывает диапазон в 77 порядков. Однако нельзя не заметить и проигрыш в количестве значащих цифр. Целочисленный 32- битный формат поддерживает 10 значащих цифр, тогда как 23-битные мантиссы вещественных данных позволяют работать с 7-8 десятичными знаками.
Наиболее часто применяемые типы вещественных чисел представлены короткими (4 байта) и длинными (8 байт) данными. Короткий вещественный формат по модулю обеспечивает представление чисел в диапазоне приблизительно от 10-38 до 10+38 с 7-8 значащими десятичными цифрами. Для 8-байтового формата диапазон существенно расширяется - от 10-308 до 10+308, а количество значащих цифр увеличивается до 15-16. Сопроцессор IBM PC предлагает расширенный десятибайтовый формат вещественных данных, перекрывающий диапазон (по модулю) от 10-4932 до 10+4932 и сохраняющий 19-20 значащих цифр.
В системах программирования Borland C++ для объявления данных вещественного типа используют спецификаторы float (короткое вещественное, 4 байта), double (вещественное с удвоенной точностью, 8 байт) и long double (длинное вещественное с удвоенной точностью, 10 байт).
В машинном представлении вещественных данных разного типа на IBM PC не выдержана какая-то общая идеология. Объясняется это, по всей вероятности, разными наслоениями на прежние аппаратные решения, которые принимались при разработке процессоров в разных отделениях фирмы Intel. Поэтому здесь имеют место такие нюансы, как сохранение в оперативной памяти или не сохранение старшего бита мантиссы, представление мантиссы в виде чисто дробного ( 0.5 <= m < 1 ) или смешанного ( 1 <= m < 2 ) числа и т.п. Прикладных программистов эти детали мало интересуют, однако при создании специальных системных компонент с точным представлением данных приходится считаться.
3.3. Внешнее представление числовых констант
В программах на языках C, C++ встречаются литеральные и именованные числовые константы целого или вещественного типа. Числовые константы, употребляемые в тексте программ в арифметических или логических выражениях, называют литеральными. Они представлены числовыми литерами - цифрами, знаками + или -, точками, отделяющими целую часть числа от дробной, показателями десятичного порядка. Например:
x=-25; //целочисленная константа -25 y=y+2.4; //вещественная константа в форме с фиксированной запятой z=2.1e-6; //вещественная константа в форме с плавающей запятой
В отличие от литеральных констант программисты часто прибегают к константам, которые подобно переменным имеют индивидуальные имена:
#define Nmax 100 const double eps=1e-6; .................. int a[Nmax] .................. for(i=0; i<Nmax; i++) .................... if(abs(z)<eps)...
Удобство именованных констант заключается в минимальных переделках программы, связанных с изменением размерности массивов и точности других управляющих констант. Достаточно изменить одну строку программы с объявлением той или иной константы и не менять другие операторы, использующие эту константу.
Под внешним представлением числовой информации мы подразумеваем способы записи данных, используемые в текстах программ, при наборе чисел, вводимых в ЭВМ по запросу программы, при отображении результатов на экране дисплея или на принтере.
Наличие в естественной записи числа точки ( 3.1415 ) или указателя десятичного порядка ( 314.159265e-02, 314.159265E-02 ) означает, что соответствующее значение представлено в ЭВМ в виде вещественного числа с плавающей запятой.
Кроме естественного представления числовых констант в виде целого или вещественного числа языки программирования допускают различные добавки в начале (" префиксы ") или конце (" суффиксы ") числа, определяющие способы преобразования и хранения данных в памяти компьютера.
В алгоритмическом языке C активно используются как префиксы, так и суффиксы:
- 0x5,0X5 - шестнадцатеричное целое число (префикс - 0x или 0X );
- 05 - восьмеричное целое число (префикс - незначащий нуль в начале);
- 5H,5h - короткое целое число (суффикс - h или H от sHort )
- 5U,5u - целое число без знака (суффикс - u или U, от Unsigned );
- 5HU,5hu,5Hu,5hU - короткое целое число без знака;
- 5L,5l - длинное целое число (суффикс - l или L, от Long );
- 5LU,5lu,5Lu,5lU - длинное целое число без знака;
- 5f,5F - короткое вещественное число (суффикс - f или F, от Float );
- 5LF,5FL,5fl,5lf,5Lf,5lF,5Fl,5fL - длинное вещественное число.
Входной язык системы визуального программирования BCB дополнительно позволяет использовать следующие суффиксы:
- i8 - для однобайтовых целых чисел со знаком (например, 127i8 )
- i16 - для двухбайтовых целых чисел со знаком;
- i32 - для четырехбайтовых целых чисел со знаком;
- i64 - для восьмибайтовых целых чисел со знаком;
- ui64 - для восьмибайтовых целых чисел без знака.