- •Логические данные
- •Символьные данные
- •Хранение текста
- •Арифметические данные
- •Данные с фиксированной точкой
- •1111111101000111(2) - Инвертируем биты - 0000000010111000(2)
- •Данные с плавающей точкой
- •Простейшие приемы анализа погрешностей.
- •Методы оптимизации
- •Данные системы Turbo Pascal
- •Способы вычисления логических операций
- •Подпрограммы и их параметры
- •Способы передачи параметров
- •Структурное программирование, управляющие конструкции, пошаговая детализация.
- •Рекурсия и итерация
- •Метод итераций (повторений)
- •Метод инварианта цикла.
- •Метод инвариантной функции.
- •Метод индуктивной функции.
- •Защитное программирование
- •Абстрактные типы данных
- •Использование объектных средств
- •Динамические структуры данных
- •Языки и грамматики
- •Расширение нотации Бэкуса-Наура.
- •Интерпретатор математических формул, реализованный на основе метода Дейкстры.
- •Абстрактные структуры данных.
- •Часть 2 Последовательность.
- •Динамический вектор.
- •Множество
- •Нагруженное множество
- •Итераторы.
1111111101000111(2) - Инвертируем биты - 0000000010111000(2)
Добавляем двоичную единицу:
0000000010111000(2) + 0000000000000001(2) = 0000000010111001(2) = |-185|
Так как один бит является знаковым, то естественно появляется разница в диапазонах
значений для чисел со знаком и без знака. Кроме этого число интерпретируется
по-разному в зависимости от того как на него смотреть.
10000000(2) - это число 128 если смотреть на него как на беззнаковое
10000000(2) - это число -128 если смотреть на него как на знаковое (судя по первому биту это
отрицательное число). Число -128 является самым большим среди однобайтовых
знаковых чисел.
01111111(2) - это число +127 - самое большое положительное число среди однобайтовых
знаковых чисел.
Еще пример, если для целого 90(10) отведено 2 байта, то содержимым байта будет двоичное число 01011010(2), а для числа –90(10) соответственно 1111111110100110(2).
Если при кодировании числа знак или цифра числа не размещается в поле, то
возникает ситуация переполнения знака.
Поскольку в ячейке из k разрядов можно записать 2k различных комбинаций из 0 и 1, то в различных ячейках можно записать:
1 байт знаковых -128..127
беззнаковых 0..255
2 байта знаковых -32768..32767
беззнаковых 0..65535
4 байта знаковых -2147483648..2147483647
беззнаковых 0..4294967295
Кроме этого в нескольких байтах можно хранить и не только целые числа. Посмотрим как можно реализовать число с фиксированной точкой на компьютере с помощью 3 байт. Первые два байта будут хранить число записанное в двоичной форме начиная со старшего разряда, а третий - положение десятичной точки. Пусть, например, надо записать в эту структуру десятичное число 1.1 - число с точкой. В двоичной системе эта дробь записывается в виде 1.0(00110). Тогда, записывая эту дробь в нашу структуру, получим:
Обращаю ваше внимание на то, что точка может находиться только в границах байта и не выходить за его пределы. Этим и отличаются данные с фиксированной точкой и плавающей точкой. Но при операциях с данными с фиксированной точкой необходимо постоянно выравнивать положение точки относительно каждого операнда, поэтому действия с фиксированной точкой выполняются за очень большое время. Из-за чего данные с фиксированной точкой очень редко используются на практике.
Данные с плавающей точкой
Числа с плавающей точкой - форма представления чисел в ЭВМ с переменным представлением запятой, отделяющей целую часть от дробной. Действия над числами с плавающей точкой более трудоемки, а ЭВМ с плавающей запятой более сложны, чем вычислительные машины с фиксированной точкой. Диапазон чисел в ЭВМ с плавающей точкой шире, чем в ЭВМ с фиксированной точкой. В отличие от порядковых типов, значения которых всегда сопоставляются с рядом целых чисел и, следовательно, представляются в ПК абсолютно точно, значения вещественных типов определяют произвольное число лишь с некоторой конечной точностью, зависящей от внутреннего формата вещественного числа.
Intel *86
В этих процессорах нет команд, реализующих арифметические операции над вещественными числами. Это связано с тем, что аппаратная реализация этих операций - вещь дорогая, а при создании во главу угла всегда ставили дешевизну; поэтому, чтобы сократить стоимость ПК, в его систему команд и не включают команды вещественной арифметики.
Как же тогда работать с вещественными числами? Возможны два решения данной проблемы.
Во-первых, на основе имеющихся команд можно написать процедуры, реализующие арифметические операции над вещественными числами, и в те места программы, где требуется выполнить операции над вещественными числами, нужно вставить обращения к этим процедурам.
Во-вторых, к ПК можно присоединить специальное устройство - арифметический сопроцессор, который умеет выполнять арифметические операции над вещественными числами. Центральный процессор взаимодействует с этим сопроцессором по следующему сценарию: когда надо выполнить вещественную операцию, центральный процессор посылает сигнал сопроцессору и передает ему соответствующие операнды (в ПК есть специальная команда для этого); сопроцессор выполняет указанную операцию, записывает результат в определенное место и возвращает управлению центральному процессору, который после этого продолжает свою работу.
Вещественное число в компьютерах Intel занимает от 4 до 10 смежных байт и имеет следующую структуру в памяти ПК:
Здесь s - знаковый разряд числа; e - экспоненциальная часть (содержит двоичный порядок); m - мантисса числа. Если переписать число, записанное в памяти, то получим следующее число
а при переводе его из двоичного в десятичное получим обычную десятичную дробь.
Рассмотрим по порядку все типы вещественных чисел на этих компьютерах. В таблице указан размер полей этих структур: