C++: Лекция 1. Представление данных
Лекция 1.
Представление данных
План.
Вступление
Системы счисления.
Представление чисел.
Беззнаковые целые двоичные числа
Целые числа со знаком
Представление вещественных чисел.
Шестнадцатеричные числа
Представление символьных данных
Вступление
Прежде чем приступить к изучению языка, сначала нужно познакомиться со способами обработки и представления чисел.
Компьютер состоит из набора цифровых электронных схем, в которых различаются два логических состояния: включено (это состояние соответствует логической единице) и выключено (это состояние соответствует логическому нулю).
Чтобы не рисовать каждый раз внутренности ячейки, положение переключателей обозначают цифрами 0 или 1.
Попробуем подсчитать, сколько разных чисел способна вместить такая ячейка. Для этого вообразим ячейку, в которой всего один переключатель c двумя состояниями: 1 и 0 (ВЕРХ и НИЗ). Значит, в такой ячейке могут храниться два числа. Если теперь добавить к ячейке еще один переключатель, число ее состояний удвоится: теперь на каждое состояние первого переключателя приходится два состояния второго. Значит, в ячейке из двух переключателей всего 4 состояния, в ячейке из трех переключателей — 8 (для каждого из четырех состояний, в которых может находиться ячейка из двух переключателей, есть два состояния третьего переключателя), а в ячейке из восьми переключателей (битов: binary digit – двоичный разряд) число возможных состояний уже 2х2х2х2х2х2х2х2=256.
Значит, в ячейку из восьми бит можно записать числа от 0 до 255 (всего 256).
С помощью одного переключателя – бита (binary digit – двоичный разряд) можно закодировать только 2 числа: 0 или 1. С помощью 2 битов – 4 числа: 00, 01, 10, 11. В ячейку из восьми бит можно записать числа от 0 до 255 (всего 256).
Для предствления чисел в памяти компьюера воспользуемся позиционным представлением чисел: каждому биту приписывается определенный вес:
Бит (разряд) |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Значение |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
вес |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
Тогда двоичное число 00001001 можно представить в виде:
00001001 =0*27 + 0*26 +0*25 + 0*24 + 1*23 + 0*22 + 0*21 + 1*2°= 910
Таким образом, ячейки памяти выглядят как последовательность нулей и единиц, независимо от того, что в них находится: число или буква.
Системы счисления.
Но работать с двоичными цифрами не всегда удобно. Поэтому, данные, обрабатываемые компьютером, необходимо представить определенным способом: определить формат представления чисел или система счисления.
В каждом формате используется свое базовое значение - количество символов с помощью которых можно представить любое число данной системы исчисления. Существует двоичная, десятичная, шестнадцатеричная и восьмеричная системы исчисления.
Например, в десятичной системе – это набор цифр от 0 до 9 (всего 10 цифр). Для представления разрядов шестнадцатеричного числа используются цифры от 0 до 9 и буквы от А до F, которые соответствуют десятичным числам от 0 до 15.
-
Система исчисления
База
Используемые цифры
Двоичная
2
0 1
Восьмеричная
8
01234567
Десятичная
10
0123456789
Шестнадцатеричная
16
01234S6789ABCDEF
Представление чисел.
Двоичные целые числа могут быть знаковыми (положительные либо отрицательные) или беззнаковыми. При использовании специальных схем кодирования с помощью двоичных чисел могут быть представлены вещественные числа.
Беззнаковые целые двоичные числа
Каждый бит беззнакового целого двоичного числа – значащий. Его порядковый номер n, соответствует значению числа 2n.
Например,
1610 = 24
1610 = 1*24 + 0*23 + 0*22 + 0*21 + 0*2°= 10000.
1710 = 24 + 20 = 1*24 + 0*23 + 0*22 + 0*21 + 1*2°= 10001.
1810 = 24 + 21 = 1*24 + 0*23 + 0*22 + 1*21 + 0*2°= 10010.
И т.д.
В семействе процессоров Intel основной единицей хранения всех типов данных является байт - 8 битов. Другие единицы хранения данных кратны байту: 2 байта (16 бит) , 4 байта (32 бита) и 8 байтов (64 байта).
Диапазон допустимых значений зависит от количества разрядов, отведенных для числа. Например, положительное целое двоичное число, состоящего из четырех битов может иметь шестнадцать различных комбинаций нулей и единиц.
-
Тип
Диапазон значений
Степени двойки
1 байт
0...255
0 ...(28-1)
2 байта
0...65 535
0 ...(216-l)
4 байта
0...4 294 967 295
0 ...(232-l)
8 байт
0... 18 446 744 073 709 551 615
0 ...(264-1)
Формула в общем виде: от 0 до 2n -1
Целые числа со знаком
Для того, чтобы понять, как в компьютере кодируются отрицательные числа, перейдем от настоящих 32-битовых чисел к «игрушечным» 4-битовым. Такими числами гораздо проще оперировать, а то, что удалось понять на их примере, легко обобщить на любое число двоичных разрядов.
Итак, число, состоящее из 4 бит, может находиться в 24 = 16 различных состояниях, и его можно поделить пополам: 8 состояний (включая 0) будут «положительными», 8 — «отрицательными».
Чтобы отрицательное число сразу можно было отличить от положительного, сделаем старший, четвертый, бит знаковым; пусть он будет равен нулю для положительных чисел и единице — для отрицательных.
С учетом сказанного в четырех битах могут уместиться (вместе с нулем) такие положительные числа:
0 1 2 3 4 5 6 7 |
0000 0001 0010 0011 0100 0101 0110 0111 |
Получим отрицательное число из положительного.
Дано:
Число 1 ( двоичное представление 0001).
Получить двоичное представление числа -1.
Разработка алгоритма решения .
1 + (-1) = 0.
Таким образом, к числу 1 надо прибавить такое число, чтобы в результате получить 0.
1111
+ 1
----
10000
Результат сложения - единица, но уже в пятом, несуществующем для 4-битовых чисел разряде (она отбрасывается). Т.о. в наших четырех битах окажутся нули, что и требуется. Т.о.
(0001 + х) +1=0
Какое число необходимо прибавить к любому числу, чтобы получить 1111?
Ответ - его инвертированное представление (нули заменяются единицами, а единицы нулями) получим:
0001 + 1110=1111.
Таким образом, для получения отрицательного чиса из положительного необходимо инвертировать его и прибавить 1.
Т. о. отрицательные числа будут кодироваться так, как показано в таблице.
-8 |
1000 |
-7 |
1001 |
-6 |
1010 |
-5 |
1011 |
-4 |
1100 |
-3 |
1101 |
-2 |
1110 |
-1 |
1111 |
0001 + 1000 = 10000
Например, чтобы получить двоичный код для -7 можно представить в виде двоичного числа разность
16 - 7 = 1000 – 0111 = 10012 = 910.
Проверка:
7 + (-7) = 0111 + 1001= 10000 = 1610.
Теперь найдем эквивалент для числа -8:
Поступая с восьмеркой так же, как только что с семеркой, получим:
-8 = 16-8 = 8 = 1000
Полученный код для отрицательных чисел называется дополнительным, потому что отрицательное число получается дополнением положительного до 16.
Дополнение до шестнадцати справедливо только для 4-битов. Для чисел размером 8- 16- и 32-значения будут иными, но принцип сохранится.
Диапазон допустимых значений звисит от количества разрядов, отведенных для числа с учем того, что один разряд отводится под знак числа.
-
Тип
Диапазон значений
Степени двойки
1 байт
-128...+ 127
-27...(27-1)
2 байта
-32 768...+32 767
-215...(215-l)
4 байта
-2 147 483 648... +2 147 483 647
-232...(232-1)
8 байт
-9 223 372 036 854 775 808...
+9 223 372 036 854 775 807
-263 … (263-1)
Формула в общем виде:
от 2n-1 до 2n-1 -1