Современные компьютеры могут обрабатывать только дискретную информацию, поэтому любой вид информации преобразуется в числовую форму, которая затем кодируется в двоичном виде.
Кодированием данных называется представление данных с помощью условных знаков. Система двоичного кодирования заключается в представлении данных произвольного типа двоичным кодом, в виде последовательности нулей и единиц.
В настоящей главе рассматриваются методы двоичного кодирования целых и действительных чисел, а также текстовой информации.
В сокращенном виде двоичный код представляется в шестнадцатеричном формате, для этого используются таблицы тетрад. Шестнадцатеричный формат обозначается hex, от hexadecimal, десятичный - dec или decimal.
Рассмотрим способы кодирования целых чисел. Для кодирования используется не менее 1 байта, или 8 двоичных разрядов. Типы данных, в которых хранятся целые числа, обычно состоят из 1, 2, 4 или 8 байт.
Рассмотрим типы данных, в которых хранятся целые неотрицательные, или беззнаковые, числа. С помощью k двоичных разрядов может быть представлено $$2^k$$ различных значений, с кодами от 00\dots0 до 11\dots1, поэтому в них хранятся целые числа в пределах от 0 до $$2^k - 1$$. Диапазоны целых беззнаковых чисел для таких типов данных, а также максимальные числа, которые в них представлены, показаны в табл. 2.1.
| Число байт | Диапазон | Максимальное число |
|---|---|---|
| 1 | от 0 до $$2^8-1$$ | 255 |
| 2 | от 0 до $$2^{16}-1$$ | 65535 |
| 4 | от 0 до $$2^{32}-1$$ | 4294967295 |
| 8 | от 0 до $$2^{64}-1$$ | 18446744073709551615 |
Пример 1. В четырех байтах число 33 кодируется в виде: $$00000000000000000000000000100001_2$$, или 00000021 (hex).
Рассмотрим типы данных, которые используются для хранения положительных и отрицательных целых чисел, или целых чисел со знаком. Диапазоны чисел для этих типов данных, которые можно закодировать с помощью 1, 2, 4 или 8 байт, а также минимальные и максимальные числа показаны в таблице 2.2. В первом столбце указывается число байт.
| Диапазон | Минимальное число | Максимальное число | |
|---|---|---|---|
| 1 | от $$-2^7$$ до $$2^7-1$$ | - 128 | 127 |
| 2 | от $$-2^{15}$$ до $$2^{15}-1$$ | - 32768 | 32767 |
| 4 | от $$-2^{31}$$ до $$2^{31}-1$$ | - 2147483648 | 2147483647 |
| 8 | от $$-2^{63}$$ до $$2^{63}-1$$ | - 9223372036854775808 |
Если количество разрядов в типе данных равно k, то диапазон кодируемых чисел составляет от $$- 2^{k - 1}$$ до $$2^{k - 1} - 1$$. Неотрицательные числа кодируются так же, как и в случае беззнаковых чисел, коды этих чисел начинаются с 0 (см. диапазон). Соответственно, коды отрицательных чисел начинаются с 1. Множество отрицательных чисел так же, как и множество положительных, представляется множеством двоичных кодов, упорядоченных по возрастанию.
Рассмотрим, например, тип данных, в котором для кодирования целых чисел со знаком используется 2 разряда. В нем могут быть закодированы числа - 2, - 1, 0, 1 с помощью кодов 10, 11, 00, 01, соответственно. Если тип данных содержит 3 разряда, то в нем могут быть представлены числа - 4, - 3, - 2, - 1, 0, 1, 2, 3 соответственно с помощью кодов 100, 101, 110, 111, 000, 001, 010, 011.
В общем случае левая граница диапазона кодируется двоичным словом 100\dots0, а правая - двоичным словом 011\dots1.
Итак, если двоичный код числа начинается с 1, то он представляет отрицательное целое число, а если с 0, - то неотрицательное. Старший разряд двоичного кода называется знаковым разрядом. Код, который используется для кодирования неотрицательных целых чисел, называется прямым, а для кодирования отрицательных - дополнительным. Дополнительные коды позволяют заменить операцию вычитания операцией сложения и сделать возможной реализацию операций сложения и вычитания одинаковыми для знаковых и беззнаковых чисел (см. ниже).
Рассмотрим понятия прямого и дополнительного кода в общем случае для системы счисления с основанием p, где p - целое, p> 1.
Пусть для p-ичного кодирования , т. е. для представления целого числа в системе счисления с основанием p, используется k разрядов, и диапазон кодируемых чисел составляет от $$- p^{k - 1}$$ до $$p^{k - 1} - 1$$.
Для целого числа x, такого что $$0 \le x < p^k$$ , выполняется разложение
$$x = b_0p^{k - 1} + b_1p^{k - 2} + \dots + b_{k - 1},$$где $$0 \le b_i < p$$, для i = 0, 1, \dots, k - 1.
Прямым кодом числа x называется его представление в p-ичном виде с помощью слова длины k:
Обратным кодом числа (-x) называется код
Обозначим через $$x_{inv}$$ число, которое представляет этот код. Имеем:
$$x_{inv} = (p - 1 - b_0)p^{k - 1} + (p - 1 - b_1)p^{k - 2} + \dots + (p - 1 - b_{k - 1}) =\\ = (p - 1)(p^{k - 1} + p^{k - 2} + \dots + 1) - (b_0p^{k - 1} + b_1p^{k - 2} + \dots + b_{k - 1}) =\\ = (p-1)\frac{p^k-1}{p-1}-x= p^k - 1 - x.$$Дополнительным кодом отрицательного числа (- x) называется p-ичное представление положительного числа
или p-ичное представление суммы
Отсюда, в частности, следует, что $$x + x_{add }= p^k$$ и $$- x = - p^k + x_{add}$$.
Например, найдем дополнительный код числа $$ (- p^{k - 1})$$ - левой границы диапазона. Прямой код числа $$p^{k - 1}$$ равен $$10\dots0_p$$. Поэтому обратный код числа - $$p^{k - 1}$$ имеет вид: $$ (p - 2)(p - 1)\dots (p - 1)_p$$. Соответственно, дополнительный код выглядит следующим образом:
$$ (p - 2)(p - 1)\dots (p - 1)_p + 1_p = (p - 1)0\dots0_p. $$Аналогично, найдем дополнительный код числа (- 1). Число 1 имеет прямой код 00\dots1, следовательно, обратный код для (- 1) имеет вид: $$ (p - 1)(p - 1) \dots (p - 2)_p$$. Поэтому дополнительным кодом числа (- 1) является $$ (p - 1)(p - 1) \dots (p - 1)_p$$. Найдем также дополнительный код числа 0. Это число имеет прямой код $$0\dots0_p$$ и, соответственно, обратный код $$ (p - 1) \dots (p - 1)_p$$. Следовательно, дополнительный код равен 1$$0\dots0$$, так что $$0_{add} = 0$$. Отметим, что в k-разрядной целочисленной арифметике полагают $$p^k \equiv 0$$, т. е. все числа рассматриваются как остатки от деления на $$p^k$$.
Пример 2. Найдем дополнительный код числа (- 127) при двоичном кодировании в 1 байте. Имеем:
прямой код числа 127: 01111111;
обратный код: 10000000;
дополнительный код: 10000000 + 1 = 10000001;
Пример 3. Найдем дополнительный код числа (- 12) при двоичном кодировании в 4 байтах типа данных integer. Имеем:
прямой код числа 12: 00000000 00000000 00000000 00001100;
обратный код: 11111111 11111111 11111111 11110011;
дополнительный код: 11111111 11111111 11111111 11110100,
или fffffff4 (hex).
Пример 4. Пусть p = 10. Тогда с помощью 4 разрядов можно закодировать целые числа в пределах от $$- 10^3$$ до $$10^3 - 1$$, т. е. от - 1000 до 999. Найдем дополнительный код при десятичном кодировании числа (- 812). Имеем:
прямой код для 812: 0812;
обратный код: 9187;
дополнительный код: 9188 (= 10000 - 812).
Пример 5. Пусть p = 16. Тогда с помощью 3 разрядов можно закодировать числа в пределах от - 256 до 255. Найдем дополнительный код при 16-ричном кодировании числа (- 50). Имеем:
прямой код числа 50: 032;
обратный код: fcd;
дополнительный код: fce.
Пусть x и y - два неотрицательных целых числа. В компьютерных вычислениях разность y - x заменяется суммой прямого кода числа y и дополнительного кода числа (- x). Пусть сначала $$y \ge x$$. Тогда
Коэффициент при $$p^k$$ выйдет за границы k разрядов, поэтому он отбрасывается (напомним, что числа рассматриваются как остатки от деления на $$p^k$$). Оставшийся код является прямым кодом разности y - x.
Пусть теперь x > y. Тогда y - x < 0. Имеем:
Таким образом,
$$ (y + x_{add})_{add} = - (y - x). $$Следовательно, если при вычислениях разность получается отрицательной (код начинается с p - 1), то величина y - x находится как дополнительный код полученного результата, умноженный на (- 1).
Аналогично,
$$- y - x = - y + p^k - x + p^k - 2p^k = y_{add} + x_{add} - 2p^k = - p^k - (y_{add} + x_{add})_{add}.$$Таким образом,
$$p^k + (y_{add} + x_{add})_{add} = - (- y - x). $$Пример 6. Найдем результаты операций сложения и вычитания
в двоичных кодах при кодировании в 1 байте.
Имеем: $$5 = 101_2 = 00000101_2; 5_{inv} = 11111010_2; 5_{add} = 11111011_2$$; $$3 = 11_2 = 00000011_2; 3_{inv} = 11111100_2; 3_{add} = 11111101_2$$.
Вычислим $$5 - 3$$ и $$5 + 3$$. Для этого найдем $$5 + 3_{add}$$ и $$5 + 3$$. Имеем:
Старший разряд полученных чисел равен 0, поэтому они представляют прямой код результатов, которые соответственно имеют вид:
$$5 - 3 = 10_2 = 2; 5 + 3 = 1000_2 = 8.$$Найдем 3 - 5 и - 3 - 5. Для этого вычислим $$3 + 5_{add}$$ и $$3_{add} + 5_{add}$$:
Старший разряд обоих полученных чисел равен 1. Поэтому они представляют отрицательные числа, и в обоих случаях следует найти дополнительный код. Имеем:
00000001 + 1 = 00000010; 00000111 + 1 = 00001000.
Дополнительный код представляет собой прямой код абсолютной величины результата. Следовательно, 3 - 5 = - 2 и - 3 - 5 = - 8.
Пример 7. Найдем разность 128 - 589, заменив операцию вычитания операцией сложения. Для десятичного кодирования в данном случае достаточно использовать 4 разряда (пример 4).
Прямой код числа 589 имеет вид: 0589. Поэтому дополнительный код числа (- 589) выглядит следующим образом: 9410 + 1 = 9411.
Найдем сумму прямого кода первого числа и дополнительного кода второго: 0128 + 9411 = 9539. Старший разряд полученного числа равен 9, поэтому оно представляет отрицательное число, и необходимо найти дополнительный код: 0460 + 1 = 0461. Таким образом, 128 - 589 = - 461.
Аналогичным образом вычислим сумму (- 128 - 589) с помощью сложения дополнительных кодов. Имеем: 9411 + 9872 =1 19283. Следовательно, - 128 - 589 = - 717.
При выполнении арифметических операций в k разрядах могут возникать ошибки.
Пример 8. Найдем сумму 58 + 96 при двоичном кодировании в 1 байте для типа данных целых чисел со знаком. Имеем: $$58 = 00111010_2, 96 = 01100000_2$$. Далее, 00111010 + 01100000 = 10011010.
Старший разряд полученного числа равен 1. Поэтому для полученного числа будет найден дополнительный код: 01100101 + 1 = 01100110. Далее, $$01100110_2 = 102$$, и результат будет иметь вид: 58 + 96 = - 102. Причина заключается в том, что слагаемые находятся внутри диапазона чисел типа данных (табл. 2.2), а сумма - вне, так что фактически находится число 58 + 96 - 256 = - 102. В данном случае для корректного выполнения арифметических операций следует перейти к типу данных, который содержит большее число разрядов.
Действительные числа в электронных вычислительных устройствах могут иметь представление в двух форматах - с фиксированной запятой (или точкой), где для хранения дробной части используется фиксированное число разрядов, и с плавающей запятой (точкой). Ниже рассматриваются методы кодирования действительных чисел в формате с плавающей запятой (точкой) в соответствии со стандартом IEEE 754 (ред. 2019), который был разработан Институтом инженеров по электротехнике и радиоэлектронике (Institute of Electrical and Electronic Engineers).
Пусть p - основание системы счисления, где p - целое, p > 1.
Экспоненциальной формой представления ненулевого числа x называется его представление в виде
где s = 0 для положительных чисел, s = 1 для отрицательных чисел, m > 0 и q - целое число. Число m называется мантиссой числа x, а число q - порядком. Для числа 0 мантисса и порядок полагаются равными 0, так что 0 представляется в виде $$0 = 0 * p^0$$.
Если $$1 \le m < p$$, то такое представление числа x называется нормализованным, или нормальным, а если $$\frac{1}{p}\le m<1$$, то денормализованным, или субнормальным.
Число, представленное в нормальной или субнормальной форме, называется, соответственно, нормализованным или субнормальным (денормализованным).
В экспоненциальной форме числа представляются в формате m+eq, m-eq, - m+eq или - m-eq, где $$q \ge 0$$. Если $$p \ne 10$$, то числа p и q могут оставаться в десятичном виде.
Пример 9. Представим числа в нормализованном виде:
43000 = 4,3+e4; 0,00003 = 3-e05; - 1 = - 1+e0 (p = 10);Пример 10. Перейдем от экспоненциального формата к представлению в p-ичном виде:
2,3456701+e10 = 23456701000; 3,14151-e02 = 0,0314151;Пример 11. Представим десятичное число 22,3 в денормализованном виде. Имеем: $$22,3 = 0,223 * 10^2$$. Поэтому мантисса числа 22,3 в субнормальной форме равна 0,223, а порядок равен 2.
В двоичной системе счисления
$$22,3 = 10110,0(1001)_2 = 0,10110100(1001)_2 * 2^5.$$Отметим, что целая часть мантиссы ненулевого двоичного нормализованного числа всегда равна 1. Соответственно, первым знаком после запятой ненулевого двоичного субнормального числа является 1.
Рассмотрим арифметические операции с нормализованными числами. Операции сложения и вычитания производятся с помощью операции выравнивания - приведения к большему порядку. Для операций умножения и деления такого выравнивания не требуется.
Пусть $$x = mp^q$$ и $$y = np^s$$ - нормализованные числа, где m, n, q, s, - целые, $$1 \le | m | < p$$ для $$x \ne 0$$, $$1 \le | n | < p$$ для $$y \ne 0$$.
Тогда
$$x + y = (m + np^{s - q})p^q; x - y = (m - np_{s - q})p^q = (mp^{q - s}- n)p^s$$;
$$x * y = (m * n)p^{q + s}; x y = (m n)p^{q - s$$}, если $$y /ne 0$$.
После выполнения арифметической операции производится операция приведения результата к нормальной форме. Аналогичным образом выполняются операции с субнормальными числами.
Пример 12. Для десятичных чисел имеем:
Пример 13. Для двоичных чисел аналогичным образом получаем:
Если число разрядов, которые используются для хранения чисел, ограничено, то при выполнении арифметических операций могут возникать ошибки из-за необходимости округления чисел.
Пусть $$x^*$$ - (приближенное) представление ненулевого числа x. Величина $$|x-x^*|$$ называется абсолютной погрешностью представления, а величина $$\frac{x-x^*}{x}$$ - его относительной погрешностью.
Пример 14. Пусть x = 3,14159 и $$x^* = 3,142$$. Тогда абсолютная и относительная погрешности равны, соответственно, 0,00041 и $$\frac{41}{314159}$$, или 0,000130507... Из значения относительной погрешности следует, что верными в представлении являются 3 значащие цифры, т. е. 3,14. Относительная погрешность не изменится для чисел x = 314,159 и $$x^* = 314,2$$, а абсолютная погрешность увеличится в 100 раз.
Рассмотрим методы представления действительных чисел в типах данных short (с половинной точностью), float (с одинарной точностью), double (с двойной точностью) и long (с двойной расширенной точностью). Ниже приведена таблица числа разрядов, которые отводятся на хранение знака, порядка и дробной части мантиссы в этих типах данных (табл. 2.3).
| Тип | Знак | Порядок | Мантисса | Общее число разрядов |
|---|---|---|---|---|
short |
1 | 5 | 10 | 16 |
float |
1 | 8 | 23 | 32 |
double |
1 | 11 | 52 | 64 |
long |
1 | 15 | 64 | 80 |
Пусть ненулевое действительное число x в нормализованной двоичной форме имеет вид $$(- 1)^s * (1 + f) * 2^q$$, где
$$s=\begin{cases} 0, \quad \text{если}\; x\ge0\\ 1, \quad \text{если}\; x<0 \end{cases}$$f - дробная часть мантиссы и q - целое число.
В старшем разряде типа данных хранится число s.
В разрядах, предназначенных для хранения порядка, хранится двоичное представление смещенного порядка, который обозначается e (от англ. exponent) и который в десятичной форме имеет вид:
e = bias + q,
где через bias обозначается величина смещения. Смещение используется для того, чтобы величина e была неотрицательной. Пусть k - число разрядов, которые используются для хранения порядка. Тогда
Таким образом, для типов данных short, float, double и long значение bias соответственно равно 15, 127, 1023 и 16383 (см. табл. 2.3).
В остальных разрядах хранится дробная часть мантиссы. Целая часть ненулевой мантиссы всегда равна 1, поэтому она не хранится; говорят, что ее представляет скрытый бит.
Например, пусть для кодирования используется тип данных float. Он содержит 32 разряда. В старшем, 31 разряде, хранится число s. В следующих 8 разрядах хранится смещенный порядок - двоичный код числа 127 + q. Оставшиеся 23 разряда предназначены для хранения дробной части f мантиссы.
Пример 15. Рассмотрим представление в формате float числа 2,3. Имеем: $$2,3 = 10,0(1001)_2$$. Соответственно, нормальная форма числа 2,3 выглядит следующим образом: $$2,3 = 1,00(1001)_2 * 2$$. Следовательно, $$q = 1, f = 0,00(1001)_2$$.
Далее, s = 0; $$e = 127 + q = 127 + 1 = 128 = 1000 0000_2$$. В последних 23 разрядах хранится приближенное двоичное представление числа f (табл. 2.4). Если значение первого знака, которое не помещается в отведенный набор разрядов, равно 1, то это представление увеличивается на 1. В данном случае этого не происходит, так как первая отбрасываемая цифра равна 0.
Порядок e |
Дробная часть мантиссы f |
||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
Таким образом, представление 2,3 в типе данных float имеет вид:
0100 0000 0001 0011 0011 0011 0011 0011 = 40133333 (hex).
Пример 16. Для числа $$1,1_{10}$$ имеем: $$1,1 = 1,0(0011)_2 * 2^0$$.
Найдем порядок: $$127 + q = 127 = 0111 1111_2$$. Соответственно, представление в типе данных float имеет вид:
0 0111 1111 000 1100 1100 1100 1100 1101 = 0011 1111 1000 1100 1100 1100 1100 1101 = 3f8ccccd (hex).
Первая отбрасываемая цифра равна 1, поэтому в нулевом разряде хранится 1, а не 0.
Пример 17. Найдем представление в типе данных float первых четырех натуральных чисел. Имеем:
Таким образом,
1 (decimal) = 3f800000 (hex); 2 (decimal) = 40000000 (hex); 3 (decimal) = 40400000 (hex); 4 (decimal) = 40800000 (hex).
Рассмотрим способы хранения чисел, представленных в форме, отличной от нормальной.
Для числа 0 имеется два представления, 00....0 и 10...0, так что он хранится со знаком, как +0 и как -0. Например, в типе данных float число +0 представлено как 00000000 (hex), а -0 - как 80000000 (hex).
В субнормальном виде хранятся числа, близкие к 0 (табл. 2.5). В двоичном коде таких чисел порядок хранится как последовательность нулей, а дробная часть мантиссы содержит хотя бы один ненулевой знак. Если значение скрытого бита в нормализованных числах равно 1, то в субнормальных числах оно равно 0.
Код (hex) |
Десятичное число, \ge 0 | Вид числа | Десятичное число, \le 0 | Код (hex) |
|---|---|---|---|---|
| 00000000 | +0 | нулевое | -0 | 80000000 |
| 00000001 | 1,401298464e-45 | субнормальное | -1,401298464e-45 | 80000001 |
| $$\dots$$ | $$\dots$$ | $$\dots$$ | $$\dots$$ | |
| 007fffff | 1,754942107e-38 | -1,754942107e-38 | 807fffff | |
| 00800000 | 1,754943508e-38 | нормализованное | -1,754943508e-38 | 80800000 |
| $$\dots$$ | $$\dots$$ | $$\dots$$ | $$\dots$$ | |
| 7f7fffff | 3,402823466e+38 | -3,402823466e+38 | ff7fffff | |
| 7f800000 | $$ +\infty$$ | бесконечное | $$ -\infty$$ | ff800000 |
| 7f800001 | NaN | не-число | NaN | ff800001 |
| $$\dots$$ | $$\dots$$ | $$\dots$$ | $$\dots$$ | |
| 7fffffff | NaN | NaN | ffffffff |
В свою очередь, двоичный код, в котором порядок представляет собой последовательность единиц, а дробная часть мантиссы - последовательность нулей, используется для хранения бесконечностей - $$+\infty$$ и $$-\infty$$. Например, в типе данных float код 7f800000 (hex) представляет $$+\infty$$, а код ff800000 (hex), соответственно, $$-\infty$$. Если при этом дробная часть мантиссы содержит хотя бы один знак, значение которого равно 1, то такой код представляет не-число - NaN (от англ. not a number). Выделяют два вида не-чисел - qNaN, от quiet NaN ("тихий"), и sNaN, от signaling NaN ("сигнальный", или "сигнализационный"). В реализациях языков программирования они обычно отличаются старшим битом дробной части мантиссы. Второй из этих видов, как правило, возвращает исключительную ситуацию.
Табл. 2.5 содержит перечисление двоичных кодов от 00000000 до ffffffff, представляющих неотрицательные и неположительные действительные числа в типе данных float, а также бесконечности и не-числа.
Для нормализованных чисел преобразование двоичного кода в десятичный формат выполняется по формуле (в обозначениях из п. 2.2.3):
$$x = (1 - 2s)(1 + f) * 2^{e - bias}.$$Пример 18. Найдем действительное число x, которое в типе данных float хранится в виде 47a80000 (hex). По таблице тетрад имеем:
47a80000 (hex) = 0100 0111 1010 1000 0000 0000 0000 0000 = 0 10001111 010 1000 0000 0000 0000 0000.
Найдем порядок: $$10001111_2 = 143$$. Следовательно,
q = 143 - bias = 143 - 127 = 16.
Теперь найдем мантиссу. Имеем:
$$1 + f = 1,010 1000 0000 0000 0000 0000 = 1,0101_2.$$Таким образом,
$$x = 1,0101_2 * 2^{16}= 10101_2 * 2^{12}= 21 * 4096 = 86016.$$Для денормализованных чисел преобразование в десятичный формат выполняется следующим образом:
$$x = (1 - 2s)f * 2^{1 - bias}.$$Пример 19. Найдем действительное число x, которое в типе данных float хранится в виде 00700000 (hex). По таблице тетрад получаем:
00700000 (hex) = 0000 0000 0111 0000 0000 0000 0000 0000 = 0 00000000 111 0000 0000 0000 0000 0000.
Заметим, что число является субнормальным. Вычислим порядок и мантиссу: q = 1 - bias = - 126; $$f = 0,1110\dots0 = 111_2 * 2^{- 3}$$.
Таким образом,
$$x = 7 * 2^{- 129} \approx 0,1028557557 * 10^{- 39}.$$Порядок, в котором последовательность байт представляет информацию в вычислительных устройствах, определяется соглашениями. Например, если используется порядок от старшего к младшему (англ. big-endian), то запись начинается со старшего байта и заканчивается младшим. Если применяется порядок от младшего к старшему (англ. little-endian), то запись начинается с младшего байта и заканчивается старшим.
Пример 20. Число 2,3 в типе данных float (см. пример 15) представляется в виде 40133333 (hex), если используется порядок от старшего к младшему, и в виде 33331340 (hex), для порядка от младшего к старшему.
Представление действительных чисел в компьютере связано с ошибками, которые могут первоначально возникать как результат округления, а затем возрастать во время выполнения арифметических операций над ними. Одним из следствий этого является то, что проверку на точное равенство двух действительных чисел обычно заменяют сравнением абсолютной величины их разности с достаточно малой величиной.
Текст - это последовательность символов. Каждый символ кодируется целым числом, поэтому текст представляется в виде набора чисел - кодов символов. Для кодирования символов и их декодирования, т. е. восстановления символов по кодам, применяются таблицы символов.
Кодовые таблицы символов, которые используются в вычислительных устройствах, подчиняются международным стандартам. В основе кодовых таблиц лежит таблица символов ASCII (American Standard Code for Information Interchange), которую ввел Американский государственный институт по стандартизации (ANSI - American National Standard Institute) в 1963 г.
Изначально для кодирования символа использовалось 7 разрядов, так что можно было закодировать 128 различных символов. Потом стали использовать 8 разрядов, с помощью которых можно закодировать 256 символов. В системе ASCII используются две таблицы кодирования: базовая, в которой для кодирования символов используются десятичные коды от 0 до 127, и расширенная - с кодами от 128 до 255.
Первые 32 кода (от 0 до 31) базовой таблицы представляют непечатные символы - управляющие коды. Остальные коды представляют буквы английского алфавита, цифры, знаки препинания, основные математические символы и некоторые вспомогательные символы.
В таблице 2.6 представлены печатные символы (Char) базовой таблицы ASCII вместе с их десятичными (Dec) и 16-ричными (Hex) кодами, от 20 (hex) до 7f (hex) включительно.
Изображаемые символы имеют коды от 21 (hex) до 7e (hex). Код 20 (hex) представляет операцию перемещения курсора на 1 позицию вправо, или пробельный символ. Код 7f (hex) соответствует операции удаления предыдущего символа.
Dec |
Hex |
Char |
Dec |
Hex |
Char |
Dec |
Hex |
Char |
Dec |
Hex |
Char |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 32 | 20 | Space | 56 | 38 | 8 | 80 | 50 | P | 104 | 69 | h |
| 33 | 21 | ! | 57 | 39 | 9 | 81 | 51 | Q | 105 | 6a | i |
| 34 | 32 | " | 58 | 3a | : | 82 | 52 | R | 106 | 6a | j |
| 35 | 23 | # | 59 | 3b | ; | 83 | 53 | S | 107 | 6b | k |
| 36 | 24 | $ | 60 | 3c | < | 84 | 54 | T | 108 | 6c | l |
| 37 | 25 | % | 61 | 3d | = | 85 | 55 | U | 109 | 6d | m |
| 38 | 26 | 62 | 3e | > | 86 | 56 | V | 110 | 6e | n | |
| 39 | 27 | ' | 63 | 3f | ? | 87 | 57 | W | 111 | 6f | o |
| 40 | 28 | ( | 64 | 40 | @ | 88 | 58 | X | 112 | 70 | p |
| 41 | 29 | ) | 65 | 41 | A | 89 | 59 | Y | 113 | 71 | q |
| 42 | 2a | * | 66 | 42 | B | 90 | 5a | Z | 114 | 72 | r |
| 43 | 2b | + | 67 | 43 | C | 91 | 5b | [ | 115 | 73 | s |
| 44 | 2c | , | 68 | 44 | D | 92 | 5c | \ | 116 | 74 | t |
| 45 | 2d | - | 69 | 45 | E | 93 | 5d | ] | 117 | 75 | u |
| 46 | 2e | . | 70 | 46 | F | 94 | 5e | ^ | 118 | 76 | v |
| 47 | 2f | / | 71 | 47 | G | 95 | 5f | _ | 119 | 77 | w |
| 48 | 30 | 0 | 72 | 48 | H | 96 | 60 | ′ | 120 | 78 | x |
| 49 | 31 | 1 | 73 | 49 | I | 97 | 61 | a | 121 | 79 | y |
| 50 | 32 | 2 | 74 | 4a | J | 98 | 62 | b | 122 | 7a | z |
| 51 | 33 | 3 | 75 | 4b | K | 99 | 63 | c | 123 | 7b | { |
| 52 | 34 | 4 | 76 | 4c | L | 100 | 64 | d | 124 | 7c | | |
| 53 | 35 | 5 | 77 | 4d | M | 101 | 65 | e | 125 | 7d | } |
| 54 | 36 | 6 | 78 | 4e | N | 102 | 66 | f | 126 | 7e | $$\backsim$$ |
| 55 | 37 | 7 | 79 | 4f | O | 103 | 67 | g | 127 | 7f | Del |
Пример 21. Слово "Science" в системе ASCII кодируется следующим образом:
83 99 105 101 110 99 101 (decimal); 53 63 69 65 6e 63 65 (hex); 01010011011000110110100101100101011011100110001101100101 (двоичный код).
Пример 22. Найдем текст, который представляется двоичным кодом 0111100000100000001010110010000001111001 в системе кодирования ASCII. Разобьем код на группы по 8 знаков. Имеем:
0111 1000 0010 0000 0010 1011 0010 0000 0111 1001,
или 78 20 2b 20 79 (hex). По табл. 2.6 получаем, что код представляет выражение x + y.
Коды от 128 до 255 расширенной таблицы ASCII предназначены для букв национальных алфавитов и других знаков.
Для кодирования букв русского алфавита было создано несколько кодовых таблиц. Широко распространенными системами кодирования кириллицы являются КОИ-8, Windows-1251 и CP-866 (фрагменты этих таблиц с десятичными кодами символов приведены ниже). Первоначально была введена система кодирования КОИ-7 (код обмена информации, 7-битовый), затем для кодирования символов стала использоваться расширенная таблица ASCII.
В кодовой таблице КОИ-8 (международное название - KOI8-R) буквы русского алфавита располагаются таким образом, чтобы их позиции соответствовали английским фонетическим аналогам базовой таблицы ( табл. 2.7).
| Ю | а | б | ц | д | е | ф | г | х | и | й | к | л | м | н | о |
| 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 |
| П | я | р | с | т | у | ж | в | ь | ы | з | ш | э | щ | ч | ъ |
| 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 |
| Ю | А | Б | Ц | Д | Е | Ф | Г | Х | И | Й | К | Л | М | Н | О |
| 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 |
| П | Я | Р | С | Т | У | Ж | В | Ь | Ы | З | Ш | Э | Щ | Ч | Ъ |
| 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 |
В отличие от таблиц Windows-1251 и CP-866, коды строчных букв в таблице КОИ-8 предшествуют кодам прописных.
Кодовая таблица Windows-1251, или CP-1251 (от англ. code page - кодовая страница) разработана корпорацией Microsoft (табл. 2.8).
| А | Б | В | Г | Д | Е | Ж | З | И | Й | К | Л | М | Н | О | П |
| 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 |
| Р | С | Т | У | Ф | Х | Ц | Ч | Ш | Щ | Ъ | Ы | Ь | Э | Ю | Я |
| 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 |
| А | б | в | г | д | е | ж | з | и | й | к | л | м | н | о | п |
| 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 |
| Р | с | т | у | ф | х | ц | ч | ш | щ | ъ | ы | ь | э | ю | я |
| 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 |
Кодовая таблица CP-866 создана компанией IBM (табл. 2.9).
Вышеупомянутые таблицы являются ASCII-совместимыми: для кодирования символа в них используется один байт, первые 128 символов - такие же, как в базовой таблице ASCII.
| А | Б | В | Г | Д | Е | Ж | З | И | Й | К | Л | М | Н | О | П |
| 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |
| Р | С | Т | У | Ф | Х | Ц | Ч | Ш | Щ | Ъ | Ы | Ь | Э | Ю | Я |
| 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 |
| А | б | в | г | д | е | ж | з | и | й | к | л | м | н | о | п |
| 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 |
| Р | с | т | у | ф | х | ц | ч | ш | щ | ъ | ы | ь | э | ю | я |
| 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 245 | 246 | 247 | 248 | 249 |
Пример 23. Слово "Наука" имеет десятичный код
238 193 213 203 193 - в кодировке КОИ-8;
205 224 243 234 224 - в кодировке CP-1251;
141 160 227 170 160 - в кодировке CP-866.
В системе CP-1251 двоичный код этого слова имеет вид: 110011011110 0000111100111110101011100000, или cd e0 f3 ea e0 (hex).
Пример 24. Сообщение "Привет, мир!", написанное в кодировке CP-1251 и прочитанное в кодировке КОИ-8, будет выглядеть следующим образом: "оПХБЕР, ЛХП!". Этот же текст, написанный в кодировке КОИ-8, будет в кодировке CP-1251 иметь вид: "рТЙЧЕФ, НЙТ!".
В самом деле, в первом случае выражение "Привет, мир!" в десятичном виде кодируется так, как показано ниже ( табл. 2.6 и 2.8):
34 207 240 232 226 229 242 44 32 236 232 240 33 34
Если этот код декодировать с помощью таблиц 2.6 и 2.7, то получится строка "оПХБЕР, ЛХП!".
Во втором случае кодирование и декодирование выполняется аналогичным образом.
Стандарт универсальной системы кодирования Unicode (Юникод) был предложен в 1991 г. организацией Консорциум Юникода (Unicode Consortium). Сначала для кодирования символа в этой системе использовалось 2 байта, так что представить в ней можно было $$2^{16}$$, или 65536 значений. Символы обозначались четырьмя 16-ричными цифрами в виде U+04ff. Затем кодовая область была расширена. Применение стандарта позволяет закодировать большое число символов.
Стандарт системы Unicode содержит 2 основных раздела:
UCS (Universal Character Set) - универсальный набор символов;UTF (Unicode Transformation Format) - семейство кодировок.Универсальный набор символов UCS определяет соответствие символов кодам, а семейство кодировок UTF - представление последовательностей кодов в вычислительных устройствах.
Множество кодов образует кодовое пространство. Это пространство разделено на плоскости по $$2^{16}$$ символов. В нулевой плоскости, которая является базовой, расположены символы наиболее употребительных письменностей, в первой плоскости - исторические символы, и т. д. Символы нулевой плоскости занимают диапазон от U+0000 до U+ffff, первой плоскости - от U+10000 до U+1ffff, и так далее, до U+10ffff.
Символы каждой плоскости разделены на несколько областей. Например, область с кодами от U+0000 до U+007f содержит символы базовой таблицы ASCII. Буквы русского языка, кроме Ё и ё, имеют коды от U+0410 до U+044f; буква Ё имеет код U+0401, а буква ё - код U+0451.
Существует несколько форматов представления кодов символов системы Unicode. Например, представление системы UTF-8 обеспечивает наилучшую совместимость с системами, использующими 8-битные символы. Текст, состоящий только из символов, номера которых менее 128, при записи в UTF-8 преобразуется в обычный текст ASCII. И, наоборот, в кодах UTF-8 байт, значение которого менее 128, соответствует символу ASCII с тем же кодом. Остальные символы отображаются последовательностями длиной от 2 до 6 байт. В системе UTF-16 для кодирования Unicode-символов используется от 2 до 4 байт; всего она позволяет записать 1 112 064 символов. Система UTF-32 использует для кодирования каждого символа 4 байта, при этом символ является прямым представлением его кодовой позиции.
Рассмотрим способы, с помощью которых можно ввести символы в документ Office по их кодам, десятичным или 16-ричным, если на компьютере установлена операционная система Windows.
Первый способ - использовать Alt-код, который представляет собой десятичный код символа, вводящийся на цифровой клавиатуре при нажатой клавише Alt (цифровая клавиатура должна быть включена). Символ в документе отображается после отпускания клавиши Alt.
Отметим, что Alt-коды 32 - 255 соответствуют кодовой странице CP-866.
Пример 25. Удерживая клавишу Alt, введем на цифровой клавиатуре код 239, затем отпустим клавишу Alt. В результате появится буква я (табл. 2.9).
Если последовательно ввести .
Букву ё можно ввести как с помощью Alt-кода 241, так и с помощью Alt-кода 1105, так как эта буква в системе Unicode представлена 16-ричным кодом U+0451, что соответствует десятичному коду 1105.
Второй способ ввести символ с помощью кода - написать в документе 16-ричный код символа из таблицы Unicode и затем использовать сочетание клавиш Alt + X, чтобы преобразовать код в символ. Можно выполнить и обратное действие: чтобы отобразить код Unicode-символа, уже находящегося в документе, следует поместить курсор непосредственно после символа и нажать Alt + X.
Пример 26. Символ $$\frac{7}{8}$$ имеет код U+215e. Если в документе написать 215e (или U+215e) и затем использовать сочетание клавиш Alt + X, то код заменится символом $$\frac{7}{8}$$. После повторного нажатия Alt + X вместо этого символа появится код 215E.
Пример 27. Римские числа, приведенные ниже, можно ввести как с помощью 16-ричных кодов 2160 - 216f и сочетания клавиш Alt + X, так и с помощью Alt-кодов 8544 - 8559:
I II III IV V VI VII VIII IX X XI XII L C D M
Таблица символов Windows входит в состав операционной системы Windows. В этой таблице содержатся все символы для имеющихся в системе шрифтов. Для того чтобы поместить символ из этой таблицы в документ, его следует выделить, а затем использовать кнопки "Выбрать" и "Копировать" (и сочетание клавиш Ctrl+V).
Пример 28. Откроем таблицу символов и вставим их в документ. Первые два из них являются символами шрифта Cambria Math, третий - символом из Wingdings.
Найдите для числа (- 100) дополнительный код, если для двоичного кодирования используется следующее число байт:
a) 1;
b) 2;
c) 4.
Найдите дополнительный код при двоичном кодировании в 1 байте типа данных целых чисел со знаком числа:
a) - 5;
b) - 11;
c) - 17;
d) - 123.
Найдите дополнительный код числа (- 73) при p-ичном кодировании в 1 байте, если p равно
a) 2;
b) 8;
c) 10;
d) 16.
Найдите десятичное число, дополнительный двоичный код которого имеет вид:
a) 10010001;
b) 11001100;
c) 1100110101001010.
Найдите дополнительные коды и выполните операции сложения и вычитания в типе данных целых чисел со знаком при двоичном кодировании в 1 байте:
a) 22 - 35;
b) 35 - 22;
c) 22 + 35;
d) - 22 - 35.
Замените операцию вычитания операцией сложения дополнительных кодов, при десятичном кодировании, и вычислите:
a) 1024 - 736;
b) 736 - 1024;
c) 33 - 2222;
d) 2222 - 33.
Вычислите, заменив операцию вычитания операцией сложения дополнительных кодов при 16-ричном кодировании:
a) a1b4 - 7c35;
b) 7c35 - a1b4;
c) aaa - e;
d) e - aaa.
Приведите к 1) нормальной; 2) субнормальной форме число
a) - 22,22;
b) 0,0055;
c) $$1001,1001_2$$;
d) - 0,000001012.
Найдите p-ичное представление нормализованного числа
a) $$- 4,01e+5, p = 10;$$
b) $$6,7e-5, p = 10;$$
d) $$1,01_2 * 2^{- 5}, p = 2.$$
Выполните действие и приведите результат к той же форме, нормальной или субнормальной:
a) $$2,02e+4 + 1,1e+2; $$
b) $$2,22e+3 - 3,3e-2; $$
c) $$4,4e+3 * 7,7e-2; $$
d) $$2e-7 5e+3; $$
e) $$0,1_2 * 2^{-100} + 0,1_2 * 2^{-99};$$
f) $$0,1_2 * 2^{-100} - 0,1_2 * 2^{-101};$$
g) $$1,011_2 * 2^6 * 1,01_2 * 2^{- 4};$$
h) $$1,0_2 * 2^5 1,1_2 * 2^7. $$
Найдите представление числа 33,7, используя порядок записи байт 1) от старшего к младшему; 2) от младшего к старшему,
a) с одинарной точностью (в типе данных float);
b) с двойной точностью (в типе данных double).
Найдите десятичное число, представление которого с одинарной точностью (в типе данных float) имеет вид:
a) 40a38000 (hex);
b) 006a8000 (hex),
при записи байт от старшего к младшему.
С помощью таблицы ASCII найдите код
1) десятичный;
2) шестнадцатеричный;
3) двоичный
a) слова Wisdom;
b) фразы "Hello, World!";
c) выражения y = x^2 + ln(x).
Найдите текст, который в системе ASCII кодируется следующим образом:
0100010101110100011001010111001001101110011010010111010001111001;
66 6f 72 20 77 68 61 74 65 76 65 72 20 61 20 6d 61 6e 20 73 6f 77 73 2c 20 74 68 61 74 20 68 65 20 77 69 6c 6c 20 61 6c 73 6f 20 72 65 61 70 (hex).
Восстановите текст, написанный на русском языке:
оПХБЕРЯРБСЧ РЕАЪ, ОСЯРШММШИ СЦНКНЙ (ю.я. оСЬЙХМ)
Напишите фразу "Люблю грозу в начале мая", используя
a) Alt-коды символов;
b) 16-ричные коды и сочетание клавиш Alt + X.
Вставьте в документ Word, с помощью кодов символов и сочетания клавиш Ctrl+= и Ctrl+Shift++, выражение
a) $$H_2O$$;
b) $$2\pi r$$;
c) $$\pir^2$$;
d) $$\cos^2\alpha + \sin^2\alpha = 1$$.
Вставьте в документ из таблицы символов Windows символ
a) $$\Bbb R$$;
b)
;
c) $$\frac56$$
d)
Современные компьютеры могут обрабатывать только дискретную информацию, поэтому любой вид информации преобразуется в числовую форму, которая затем кодируется в двоичном виде.
Кодированием данных называется представление данных с помощью условных знаков. Система двоичного кодирования заключается в представлении данных произвольного типа двоичным кодом, в виде последовательности нулей и единиц.
В настоящей главе рассматриваются методы двоичного кодирования целых и действительных чисел, а также текстовой информации.
В сокращенном виде двоичный код представляется в шестнадцатеричном формате, для этого используются таблицы тетрад. Шестнадцатеричный формат обозначается hex, от hexadecimal, десятичный - dec или decimal.
Рассмотрим способы кодирования целых чисел. Для кодирования используется не менее 1 байта, или 8 двоичных разрядов. Типы данных, в которых хранятся целые числа, обычно состоят из 1, 2, 4 или 8 байт.
Рассмотрим типы данных, в которых хранятся целые неотрицательные, или беззнаковые, числа. С помощью k двоичных разрядов может быть представлено $$2^k$$ различных значений, с кодами от 00\dots0 до 11\dots1, поэтому в них хранятся целые числа в пределах от 0 до $$2^k - 1$$. Диапазоны целых беззнаковых чисел для таких типов данных, а также максимальные числа, которые в них представлены, показаны в табл. 2.1.
| Число байт | Диапазон | Максимальное число |
|---|---|---|
| 1 | от 0 до $$2^8-1$$ | 255 |
| 2 | от 0 до $$2^{16}-1$$ | 65535 |
| 4 | от 0 до $$2^{32}-1$$ | 4294967295 |
| 8 | от 0 до $$2^{64}-1$$ | 18446744073709551615 |
Пример 1. В четырех байтах число 33 кодируется в виде: $$00000000000000000000000000100001_2$$, или 00000021 (hex).
Рассмотрим типы данных, которые используются для хранения положительных и отрицательных целых чисел, или целых чисел со знаком. Диапазоны чисел для этих типов данных, которые можно закодировать с помощью 1, 2, 4 или 8 байт, а также минимальные и максимальные числа показаны в таблице 2.2. В первом столбце указывается число байт.
| Диапазон | Минимальное число | Максимальное число | |
|---|---|---|---|
| 1 | от $$-2^7$$ до $$2^7-1$$ | - 128 | 127 |
| 2 | от $$-2^{15}$$ до $$2^{15}-1$$ | - 32768 | 32767 |
| 4 | от $$-2^{31}$$ до $$2^{31}-1$$ | - 2147483648 | 2147483647 |
| 8 | от $$-2^{63}$$ до $$2^{63}-1$$ | - 9223372036854775808 |
Если количество разрядов в типе данных равно k, то диапазон кодируемых чисел составляет от $$- 2^{k - 1}$$ до $$2^{k - 1} - 1$$. Неотрицательные числа кодируются так же, как и в случае беззнаковых чисел, коды этих чисел начинаются с 0 (см. диапазон). Соответственно, коды отрицательных чисел начинаются с 1. Множество отрицательных чисел так же, как и множество положительных, представляется множеством двоичных кодов, упорядоченных по возрастанию.
Рассмотрим, например, тип данных, в котором для кодирования целых чисел со знаком используется 2 разряда. В нем могут быть закодированы числа - 2, - 1, 0, 1 с помощью кодов 10, 11, 00, 01, соответственно. Если тип данных содержит 3 разряда, то в нем могут быть представлены числа - 4, - 3, - 2, - 1, 0, 1, 2, 3 соответственно с помощью кодов 100, 101, 110, 111, 000, 001, 010, 011.
В общем случае левая граница диапазона кодируется двоичным словом 100\dots0, а правая - двоичным словом 011\dots1.
Итак, если двоичный код числа начинается с 1, то он представляет отрицательное целое число, а если с 0, - то неотрицательное. Старший разряд двоичного кода называется знаковым разрядом. Код, который используется для кодирования неотрицательных целых чисел, называется прямым, а для кодирования отрицательных - дополнительным. Дополнительные коды позволяют заменить операцию вычитания операцией сложения и сделать возможной реализацию операций сложения и вычитания одинаковыми для знаковых и беззнаковых чисел (см. ниже).
Рассмотрим понятия прямого и дополнительного кода в общем случае для системы счисления с основанием p, где p - целое, p> 1.
Пусть для p-ичного кодирования , т. е. для представления целого числа в системе счисления с основанием p, используется k разрядов, и диапазон кодируемых чисел составляет от $$- p^{k - 1}$$ до $$p^{k - 1} - 1$$.
Для целого числа x, такого что $$0 \le x < p^k$$ , выполняется разложение
$$x = b_0p^{k - 1} + b_1p^{k - 2} + \dots + b_{k - 1},$$где $$0 \le b_i < p$$, для i = 0, 1, \dots, k - 1.
Прямым кодом числа x называется его представление в p-ичном виде с помощью слова длины k:
Обратным кодом числа (-x) называется код
Обозначим через $$x_{inv}$$ число, которое представляет этот код. Имеем:
$$x_{inv} = (p - 1 - b_0)p^{k - 1} + (p - 1 - b_1)p^{k - 2} + \dots + (p - 1 - b_{k - 1}) =\\ = (p - 1)(p^{k - 1} + p^{k - 2} + \dots + 1) - (b_0p^{k - 1} + b_1p^{k - 2} + \dots + b_{k - 1}) =\\ = (p-1)\frac{p^k-1}{p-1}-x= p^k - 1 - x.$$Дополнительным кодом отрицательного числа (- x) называется p-ичное представление положительного числа
или p-ичное представление суммы
Отсюда, в частности, следует, что $$x + x_{add }= p^k$$ и $$- x = - p^k + x_{add}$$.
Например, найдем дополнительный код числа $$ (- p^{k - 1})$$ - левой границы диапазона. Прямой код числа $$p^{k - 1}$$ равен $$10\dots0_p$$. Поэтому обратный код числа - $$p^{k - 1}$$ имеет вид: $$ (p - 2)(p - 1)\dots (p - 1)_p$$. Соответственно, дополнительный код выглядит следующим образом:
$$ (p - 2)(p - 1)\dots (p - 1)_p + 1_p = (p - 1)0\dots0_p. $$Аналогично, найдем дополнительный код числа (- 1). Число 1 имеет прямой код 00\dots1, следовательно, обратный код для (- 1) имеет вид: $$ (p - 1)(p - 1) \dots (p - 2)_p$$. Поэтому дополнительным кодом числа (- 1) является $$ (p - 1)(p - 1) \dots (p - 1)_p$$. Найдем также дополнительный код числа 0. Это число имеет прямой код $$0\dots0_p$$ и, соответственно, обратный код $$ (p - 1) \dots (p - 1)_p$$. Следовательно, дополнительный код равен 1$$0\dots0$$, так что $$0_{add} = 0$$. Отметим, что в k-разрядной целочисленной арифметике полагают $$p^k \equiv 0$$, т. е. все числа рассматриваются как остатки от деления на $$p^k$$.
Пример 2. Найдем дополнительный код числа (- 127) при двоичном кодировании в 1 байте. Имеем:
прямой код числа 127: 01111111;
обратный код: 10000000;
дополнительный код: 10000000 + 1 = 10000001;
Пример 3. Найдем дополнительный код числа (- 12) при двоичном кодировании в 4 байтах типа данных integer. Имеем:
прямой код числа 12: 00000000 00000000 00000000 00001100;
обратный код: 11111111 11111111 11111111 11110011;
дополнительный код: 11111111 11111111 11111111 11110100,
или fffffff4 (hex).
Пример 4. Пусть p = 10. Тогда с помощью 4 разрядов можно закодировать целые числа в пределах от $$- 10^3$$ до $$10^3 - 1$$, т. е. от - 1000 до 999. Найдем дополнительный код при десятичном кодировании числа (- 812). Имеем:
прямой код для 812: 0812;
обратный код: 9187;
дополнительный код: 9188 (= 10000 - 812).
Пример 5. Пусть p = 16. Тогда с помощью 3 разрядов можно закодировать числа в пределах от - 256 до 255. Найдем дополнительный код при 16-ричном кодировании числа (- 50). Имеем:
прямой код числа 50: 032;
обратный код: fcd;
дополнительный код: fce.
Пусть x и y - два неотрицательных целых числа. В компьютерных вычислениях разность y - x заменяется суммой прямого кода числа y и дополнительного кода числа (- x). Пусть сначала $$y \ge x$$. Тогда
Коэффициент при $$p^k$$ выйдет за границы k разрядов, поэтому он отбрасывается (напомним, что числа рассматриваются как остатки от деления на $$p^k$$). Оставшийся код является прямым кодом разности y - x.
Пусть теперь x > y. Тогда y - x < 0. Имеем:
Таким образом,
$$ (y + x_{add})_{add} = - (y - x). $$Следовательно, если при вычислениях разность получается отрицательной (код начинается с p - 1), то величина y - x находится как дополнительный код полученного результата, умноженный на (- 1).
Аналогично,
$$- y - x = - y + p^k - x + p^k - 2p^k = y_{add} + x_{add} - 2p^k = - p^k - (y_{add} + x_{add})_{add}.$$Таким образом,
$$p^k + (y_{add} + x_{add})_{add} = - (- y - x). $$Пример 6. Найдем результаты операций сложения и вычитания
в двоичных кодах при кодировании в 1 байте.
Имеем: $$5 = 101_2 = 00000101_2; 5_{inv} = 11111010_2; 5_{add} = 11111011_2$$; $$3 = 11_2 = 00000011_2; 3_{inv} = 11111100_2; 3_{add} = 11111101_2$$.
Вычислим $$5 - 3$$ и $$5 + 3$$. Для этого найдем $$5 + 3_{add}$$ и $$5 + 3$$. Имеем:
Старший разряд полученных чисел равен 0, поэтому они представляют прямой код результатов, которые соответственно имеют вид:
$$5 - 3 = 10_2 = 2; 5 + 3 = 1000_2 = 8.$$Найдем 3 - 5 и - 3 - 5. Для этого вычислим $$3 + 5_{add}$$ и $$3_{add} + 5_{add}$$:
Старший разряд обоих полученных чисел равен 1. Поэтому они представляют отрицательные числа, и в обоих случаях следует найти дополнительный код. Имеем:
00000001 + 1 = 00000010; 00000111 + 1 = 00001000.
Дополнительный код представляет собой прямой код абсолютной величины результата. Следовательно, 3 - 5 = - 2 и - 3 - 5 = - 8.
Пример 7. Найдем разность 128 - 589, заменив операцию вычитания операцией сложения. Для десятичного кодирования в данном случае достаточно использовать 4 разряда (пример 4).
Прямой код числа 589 имеет вид: 0589. Поэтому дополнительный код числа (- 589) выглядит следующим образом: 9410 + 1 = 9411.
Найдем сумму прямого кода первого числа и дополнительного кода второго: 0128 + 9411 = 9539. Старший разряд полученного числа равен 9, поэтому оно представляет отрицательное число, и необходимо найти дополнительный код: 0460 + 1 = 0461. Таким образом, 128 - 589 = - 461.
Аналогичным образом вычислим сумму (- 128 - 589) с помощью сложения дополнительных кодов. Имеем: 9411 + 9872 =1 19283. Следовательно, - 128 - 589 = - 717.
При выполнении арифметических операций в k разрядах могут возникать ошибки.
Пример 8. Найдем сумму 58 + 96 при двоичном кодировании в 1 байте для типа данных целых чисел со знаком. Имеем: $$58 = 00111010_2, 96 = 01100000_2$$. Далее, 00111010 + 01100000 = 10011010.
Старший разряд полученного числа равен 1. Поэтому для полученного числа будет найден дополнительный код: 01100101 + 1 = 01100110. Далее, $$01100110_2 = 102$$, и результат будет иметь вид: 58 + 96 = - 102. Причина заключается в том, что слагаемые находятся внутри диапазона чисел типа данных (табл. 2.2), а сумма - вне, так что фактически находится число 58 + 96 - 256 = - 102. В данном случае для корректного выполнения арифметических операций следует перейти к типу данных, который содержит большее число разрядов.
Действительные числа в электронных вычислительных устройствах могут иметь представление в двух форматах - с фиксированной запятой (или точкой), где для хранения дробной части используется фиксированное число разрядов, и с плавающей запятой (точкой). Ниже рассматриваются методы кодирования действительных чисел в формате с плавающей запятой (точкой) в соответствии со стандартом IEEE 754 (ред. 2019), который был разработан Институтом инженеров по электротехнике и радиоэлектронике (Institute of Electrical and Electronic Engineers).
Пусть p - основание системы счисления, где p - целое, p > 1.
Экспоненциальной формой представления ненулевого числа x называется его представление в виде
где s = 0 для положительных чисел, s = 1 для отрицательных чисел, m > 0 и q - целое число. Число m называется мантиссой числа x, а число q - порядком. Для числа 0 мантисса и порядок полагаются равными 0, так что 0 представляется в виде $$0 = 0 * p^0$$.
Если $$1 \le m < p$$, то такое представление числа x называется нормализованным, или нормальным, а если $$\frac{1}{p}\le m<1$$, то денормализованным, или субнормальным.
Число, представленное в нормальной или субнормальной форме, называется, соответственно, нормализованным или субнормальным (денормализованным).
В экспоненциальной форме числа представляются в формате m+eq, m-eq, - m+eq или - m-eq, где $$q \ge 0$$. Если $$p \ne 10$$, то числа p и q могут оставаться в десятичном виде.
Пример 9. Представим числа в нормализованном виде:
43000 = 4,3+e4; 0,00003 = 3-e05; - 1 = - 1+e0 (p = 10);Пример 10. Перейдем от экспоненциального формата к представлению в p-ичном виде:
2,3456701+e10 = 23456701000; 3,14151-e02 = 0,0314151;Пример 11. Представим десятичное число 22,3 в денормализованном виде. Имеем: $$22,3 = 0,223 * 10^2$$. Поэтому мантисса числа 22,3 в субнормальной форме равна 0,223, а порядок равен 2.
В двоичной системе счисления
$$22,3 = 10110,0(1001)_2 = 0,10110100(1001)_2 * 2^5.$$Отметим, что целая часть мантиссы ненулевого двоичного нормализованного числа всегда равна 1. Соответственно, первым знаком после запятой ненулевого двоичного субнормального числа является 1.
Рассмотрим арифметические операции с нормализованными числами. Операции сложения и вычитания производятся с помощью операции выравнивания - приведения к большему порядку. Для операций умножения и деления такого выравнивания не требуется.
Пусть $$x = mp^q$$ и $$y = np^s$$ - нормализованные числа, где m, n, q, s, - целые, $$1 \le | m | < p$$ для $$x \ne 0$$, $$1 \le | n | < p$$ для $$y \ne 0$$.
Тогда
$$x + y = (m + np^{s - q})p^q; x - y = (m - np_{s - q})p^q = (mp^{q - s}- n)p^s$$;
$$x * y = (m * n)p^{q + s}; x y = (m n)p^{q - s$$}, если $$y /ne 0$$.
После выполнения арифметической операции производится операция приведения результата к нормальной форме. Аналогичным образом выполняются операции с субнормальными числами.
Пример 12. Для десятичных чисел имеем:
Пример 13. Для двоичных чисел аналогичным образом получаем:
Если число разрядов, которые используются для хранения чисел, ограничено, то при выполнении арифметических операций могут возникать ошибки из-за необходимости округления чисел.
Пусть $$x^*$$ - (приближенное) представление ненулевого числа x. Величина $$|x-x^*|$$ называется абсолютной погрешностью представления, а величина $$\frac{x-x^*}{x}$$ - его относительной погрешностью.
Пример 14. Пусть x = 3,14159 и $$x^* = 3,142$$. Тогда абсолютная и относительная погрешности равны, соответственно, 0,00041 и $$\frac{41}{314159}$$, или 0,000130507... Из значения относительной погрешности следует, что верными в представлении являются 3 значащие цифры, т. е. 3,14. Относительная погрешность не изменится для чисел x = 314,159 и $$x^* = 314,2$$, а абсолютная погрешность увеличится в 100 раз.
Рассмотрим методы представления действительных чисел в типах данных short (с половинной точностью), float (с одинарной точностью), double (с двойной точностью) и long (с двойной расширенной точностью). Ниже приведена таблица числа разрядов, которые отводятся на хранение знака, порядка и дробной части мантиссы в этих типах данных (табл. 2.3).
| Тип | Знак | Порядок | Мантисса | Общее число разрядов |
|---|---|---|---|---|
short |
1 | 5 | 10 | 16 |
float |
1 | 8 | 23 | 32 |
double |
1 | 11 | 52 | 64 |
long |
1 | 15 | 64 | 80 |
Пусть ненулевое действительное число x в нормализованной двоичной форме имеет вид $$(- 1)^s * (1 + f) * 2^q$$, где
$$s=\begin{cases} 0, \quad \text{если}\; x\ge0\\ 1, \quad \text{если}\; x<0 \end{cases}$$f - дробная часть мантиссы и q - целое число.
В старшем разряде типа данных хранится число s.
В разрядах, предназначенных для хранения порядка, хранится двоичное представление смещенного порядка, который обозначается e (от англ. exponent) и который в десятичной форме имеет вид:
e = bias + q,
где через bias обозначается величина смещения. Смещение используется для того, чтобы величина e была неотрицательной. Пусть k - число разрядов, которые используются для хранения порядка. Тогда
Таким образом, для типов данных short, float, double и long значение bias соответственно равно 15, 127, 1023 и 16383 (см. табл. 2.3).
В остальных разрядах хранится дробная часть мантиссы. Целая часть ненулевой мантиссы всегда равна 1, поэтому она не хранится; говорят, что ее представляет скрытый бит.
Например, пусть для кодирования используется тип данных float. Он содержит 32 разряда. В старшем, 31 разряде, хранится число s. В следующих 8 разрядах хранится смещенный порядок - двоичный код числа 127 + q. Оставшиеся 23 разряда предназначены для хранения дробной части f мантиссы.
Пример 15. Рассмотрим представление в формате float числа 2,3. Имеем: $$2,3 = 10,0(1001)_2$$. Соответственно, нормальная форма числа 2,3 выглядит следующим образом: $$2,3 = 1,00(1001)_2 * 2$$. Следовательно, $$q = 1, f = 0,00(1001)_2$$.
Далее, s = 0; $$e = 127 + q = 127 + 1 = 128 = 1000 0000_2$$. В последних 23 разрядах хранится приближенное двоичное представление числа f (табл. 2.4). Если значение первого знака, которое не помещается в отведенный набор разрядов, равно 1, то это представление увеличивается на 1. В данном случае этого не происходит, так как первая отбрасываемая цифра равна 0.
Порядок e |
Дробная часть мантиссы f |
||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
Таким образом, представление 2,3 в типе данных float имеет вид:
0100 0000 0001 0011 0011 0011 0011 0011 = 40133333 (hex).
Пример 16. Для числа $$1,1_{10}$$ имеем: $$1,1 = 1,0(0011)_2 * 2^0$$.
Найдем порядок: $$127 + q = 127 = 0111 1111_2$$. Соответственно, представление в типе данных float имеет вид:
0 0111 1111 000 1100 1100 1100 1100 1101 = 0011 1111 1000 1100 1100 1100 1100 1101 = 3f8ccccd (hex).
Первая отбрасываемая цифра равна 1, поэтому в нулевом разряде хранится 1, а не 0.
Пример 17. Найдем представление в типе данных float первых четырех натуральных чисел. Имеем:
Таким образом,
1 (decimal) = 3f800000 (hex); 2 (decimal) = 40000000 (hex); 3 (decimal) = 40400000 (hex); 4 (decimal) = 40800000 (hex).
Рассмотрим способы хранения чисел, представленных в форме, отличной от нормальной.
Для числа 0 имеется два представления, 00....0 и 10...0, так что он хранится со знаком, как +0 и как -0. Например, в типе данных float число +0 представлено как 00000000 (hex), а -0 - как 80000000 (hex).
В субнормальном виде хранятся числа, близкие к 0 (табл. 2.5). В двоичном коде таких чисел порядок хранится как последовательность нулей, а дробная часть мантиссы содержит хотя бы один ненулевой знак. Если значение скрытого бита в нормализованных числах равно 1, то в субнормальных числах оно равно 0.
Код (hex) |
Десятичное число, \ge 0 | Вид числа | Десятичное число, \le 0 | Код (hex) |
|---|---|---|---|---|
| 00000000 | +0 | нулевое | -0 | 80000000 |
| 00000001 | 1,401298464e-45 | субнормальное | -1,401298464e-45 | 80000001 |
| $$\dots$$ | $$\dots$$ | $$\dots$$ | $$\dots$$ | |
| 007fffff | 1,754942107e-38 | -1,754942107e-38 | 807fffff | |
| 00800000 | 1,754943508e-38 | нормализованное | -1,754943508e-38 | 80800000 |
| $$\dots$$ | $$\dots$$ | $$\dots$$ | $$\dots$$ | |
| 7f7fffff | 3,402823466e+38 | -3,402823466e+38 | ff7fffff | |
| 7f800000 | $$ +\infty$$ | бесконечное | $$ -\infty$$ | ff800000 |
| 7f800001 | NaN | не-число | NaN | ff800001 |
| $$\dots$$ | $$\dots$$ | $$\dots$$ | $$\dots$$ | |
| 7fffffff | NaN | NaN | ffffffff |
В свою очередь, двоичный код, в котором порядок представляет собой последовательность единиц, а дробная часть мантиссы - последовательность нулей, используется для хранения бесконечностей - $$+\infty$$ и $$-\infty$$. Например, в типе данных float код 7f800000 (hex) представляет $$+\infty$$, а код ff800000 (hex), соответственно, $$-\infty$$. Если при этом дробная часть мантиссы содержит хотя бы один знак, значение которого равно 1, то такой код представляет не-число - NaN (от англ. not a number). Выделяют два вида не-чисел - qNaN, от quiet NaN ("тихий"), и sNaN, от signaling NaN ("сигнальный", или "сигнализационный"). В реализациях языков программирования они обычно отличаются старшим битом дробной части мантиссы. Второй из этих видов, как правило, возвращает исключительную ситуацию.
Табл. 2.5 содержит перечисление двоичных кодов от 00000000 до ffffffff, представляющих неотрицательные и неположительные действительные числа в типе данных float, а также бесконечности и не-числа.
Для нормализованных чисел преобразование двоичного кода в десятичный формат выполняется по формуле (в обозначениях из п. 2.2.3):
$$x = (1 - 2s)(1 + f) * 2^{e - bias}.$$Пример 18. Найдем действительное число x, которое в типе данных float хранится в виде 47a80000 (hex). По таблице тетрад имеем:
47a80000 (hex) = 0100 0111 1010 1000 0000 0000 0000 0000 = 0 10001111 010 1000 0000 0000 0000 0000.
Найдем порядок: $$10001111_2 = 143$$. Следовательно,
q = 143 - bias = 143 - 127 = 16.
Теперь найдем мантиссу. Имеем:
$$1 + f = 1,010 1000 0000 0000 0000 0000 = 1,0101_2.$$Таким образом,
$$x = 1,0101_2 * 2^{16}= 10101_2 * 2^{12}= 21 * 4096 = 86016.$$Для денормализованных чисел преобразование в десятичный формат выполняется следующим образом:
$$x = (1 - 2s)f * 2^{1 - bias}.$$Пример 19. Найдем действительное число x, которое в типе данных float хранится в виде 00700000 (hex). По таблице тетрад получаем:
00700000 (hex) = 0000 0000 0111 0000 0000 0000 0000 0000 = 0 00000000 111 0000 0000 0000 0000 0000.
Заметим, что число является субнормальным. Вычислим порядок и мантиссу: q = 1 - bias = - 126; $$f = 0,1110\dots0 = 111_2 * 2^{- 3}$$.
Таким образом,
$$x = 7 * 2^{- 129} \approx 0,1028557557 * 10^{- 39}.$$Порядок, в котором последовательность байт представляет информацию в вычислительных устройствах, определяется соглашениями. Например, если используется порядок от старшего к младшему (англ. big-endian), то запись начинается со старшего байта и заканчивается младшим. Если применяется порядок от младшего к старшему (англ. little-endian), то запись начинается с младшего байта и заканчивается старшим.
Пример 20. Число 2,3 в типе данных float (см. пример 15) представляется в виде 40133333 (hex), если используется порядок от старшего к младшему, и в виде 33331340 (hex), для порядка от младшего к старшему.
Представление действительных чисел в компьютере связано с ошибками, которые могут первоначально возникать как результат округления, а затем возрастать во время выполнения арифметических операций над ними. Одним из следствий этого является то, что проверку на точное равенство двух действительных чисел обычно заменяют сравнением абсолютной величины их разности с достаточно малой величиной.
Текст - это последовательность символов. Каждый символ кодируется целым числом, поэтому текст представляется в виде набора чисел - кодов символов. Для кодирования символов и их декодирования, т. е. восстановления символов по кодам, применяются таблицы символов.
Кодовые таблицы символов, которые используются в вычислительных устройствах, подчиняются международным стандартам. В основе кодовых таблиц лежит таблица символов ASCII (American Standard Code for Information Interchange), которую ввел Американский государственный институт по стандартизации (ANSI - American National Standard Institute) в 1963 г.
Изначально для кодирования символа использовалось 7 разрядов, так что можно было закодировать 128 различных символов. Потом стали использовать 8 разрядов, с помощью которых можно закодировать 256 символов. В системе ASCII используются две таблицы кодирования: базовая, в которой для кодирования символов используются десятичные коды от 0 до 127, и расширенная - с кодами от 128 до 255.
Первые 32 кода (от 0 до 31) базовой таблицы представляют непечатные символы - управляющие коды. Остальные коды представляют буквы английского алфавита, цифры, знаки препинания, основные математические символы и некоторые вспомогательные символы.
В таблице 2.6 представлены печатные символы (Char) базовой таблицы ASCII вместе с их десятичными (Dec) и 16-ричными (Hex) кодами, от 20 (hex) до 7f (hex) включительно.
Изображаемые символы имеют коды от 21 (hex) до 7e (hex). Код 20 (hex) представляет операцию перемещения курсора на 1 позицию вправо, или пробельный символ. Код 7f (hex) соответствует операции удаления предыдущего символа.
Dec |
Hex |
Char |
Dec |
Hex |
Char |
Dec |
Hex |
Char |
Dec |
Hex |
Char |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 32 | 20 | Space | 56 | 38 | 8 | 80 | 50 | P | 104 | 69 | h |
| 33 | 21 | ! | 57 | 39 | 9 | 81 | 51 | Q | 105 | 6a | i |
| 34 | 32 | " | 58 | 3a | : | 82 | 52 | R | 106 | 6a | j |
| 35 | 23 | # | 59 | 3b | ; | 83 | 53 | S | 107 | 6b | k |
| 36 | 24 | $ | 60 | 3c | < | 84 | 54 | T | 108 | 6c | l |
| 37 | 25 | % | 61 | 3d | = | 85 | 55 | U | 109 | 6d | m |
| 38 | 26 | 62 | 3e | > | 86 | 56 | V | 110 | 6e | n | |
| 39 | 27 | ' | 63 | 3f | ? | 87 | 57 | W | 111 | 6f | o |
| 40 | 28 | ( | 64 | 40 | @ | 88 | 58 | X | 112 | 70 | p |
| 41 | 29 | ) | 65 | 41 | A | 89 | 59 | Y | 113 | 71 | q |
| 42 | 2a | * | 66 | 42 | B | 90 | 5a | Z | 114 | 72 | r |
| 43 | 2b | + | 67 | 43 | C | 91 | 5b | [ | 115 | 73 | s |
| 44 | 2c | , | 68 | 44 | D | 92 | 5c | \ | 116 | 74 | t |
| 45 | 2d | - | 69 | 45 | E | 93 | 5d | ] | 117 | 75 | u |
| 46 | 2e | . | 70 | 46 | F | 94 | 5e | ^ | 118 | 76 | v |
| 47 | 2f | / | 71 | 47 | G | 95 | 5f | _ | 119 | 77 | w |
| 48 | 30 | 0 | 72 | 48 | H | 96 | 60 | ′ | 120 | 78 | x |
| 49 | 31 | 1 | 73 | 49 | I | 97 | 61 | a | 121 | 79 | y |
| 50 | 32 | 2 | 74 | 4a | J | 98 | 62 | b | 122 | 7a | z |
| 51 | 33 | 3 | 75 | 4b | K | 99 | 63 | c | 123 | 7b | { |
| 52 | 34 | 4 | 76 | 4c | L | 100 | 64 | d | 124 | 7c | | |
| 53 | 35 | 5 | 77 | 4d | M | 101 | 65 | e | 125 | 7d | } |
| 54 | 36 | 6 | 78 | 4e | N | 102 | 66 | f | 126 | 7e | $$\backsim$$ |
| 55 | 37 | 7 | 79 | 4f | O | 103 | 67 | g | 127 | 7f | Del |
Пример 21. Слово "Science" в системе ASCII кодируется следующим образом:
83 99 105 101 110 99 101 (decimal); 53 63 69 65 6e 63 65 (hex); 01010011011000110110100101100101011011100110001101100101 (двоичный код).
Пример 22. Найдем текст, который представляется двоичным кодом 0111100000100000001010110010000001111001 в системе кодирования ASCII. Разобьем код на группы по 8 знаков. Имеем:
0111 1000 0010 0000 0010 1011 0010 0000 0111 1001,
или 78 20 2b 20 79 (hex). По табл. 2.6 получаем, что код представляет выражение x + y.
Коды от 128 до 255 расширенной таблицы ASCII предназначены для букв национальных алфавитов и других знаков.
Для кодирования букв русского алфавита было создано несколько кодовых таблиц. Широко распространенными системами кодирования кириллицы являются КОИ-8, Windows-1251 и CP-866 (фрагменты этих таблиц с десятичными кодами символов приведены ниже). Первоначально была введена система кодирования КОИ-7 (код обмена информации, 7-битовый), затем для кодирования символов стала использоваться расширенная таблица ASCII.
В кодовой таблице КОИ-8 (международное название - KOI8-R) буквы русского алфавита располагаются таким образом, чтобы их позиции соответствовали английским фонетическим аналогам базовой таблицы ( табл. 2.7).
| Ю | а | б | ц | д | е | ф | г | х | и | й | к | л | м | н | о |
| 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 |
| П | я | р | с | т | у | ж | в | ь | ы | з | ш | э | щ | ч | ъ |
| 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 |
| Ю | А | Б | Ц | Д | Е | Ф | Г | Х | И | Й | К | Л | М | Н | О |
| 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 |
| П | Я | Р | С | Т | У | Ж | В | Ь | Ы | З | Ш | Э | Щ | Ч | Ъ |
| 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 |
В отличие от таблиц Windows-1251 и CP-866, коды строчных букв в таблице КОИ-8 предшествуют кодам прописных.
Кодовая таблица Windows-1251, или CP-1251 (от англ. code page - кодовая страница) разработана корпорацией Microsoft (табл. 2.8).
| А | Б | В | Г | Д | Е | Ж | З | И | Й | К | Л | М | Н | О | П |
| 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 |
| Р | С | Т | У | Ф | Х | Ц | Ч | Ш | Щ | Ъ | Ы | Ь | Э | Ю | Я |
| 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 |
| А | б | в | г | д | е | ж | з | и | й | к | л | м | н | о | п |
| 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 |
| Р | с | т | у | ф | х | ц | ч | ш | щ | ъ | ы | ь | э | ю | я |
| 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 |
Кодовая таблица CP-866 создана компанией IBM (табл. 2.9).
Вышеупомянутые таблицы являются ASCII-совместимыми: для кодирования символа в них используется один байт, первые 128 символов - такие же, как в базовой таблице ASCII.
| А | Б | В | Г | Д | Е | Ж | З | И | Й | К | Л | М | Н | О | П |
| 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |
| Р | С | Т | У | Ф | Х | Ц | Ч | Ш | Щ | Ъ | Ы | Ь | Э | Ю | Я |
| 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 |
| А | б | в | г | д | е | ж | з | и | й | к | л | м | н | о | п |
| 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 |
| Р | с | т | у | ф | х | ц | ч | ш | щ | ъ | ы | ь | э | ю | я |
| 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 245 | 246 | 247 | 248 | 249 |
Пример 23. Слово "Наука" имеет десятичный код
238 193 213 203 193 - в кодировке КОИ-8;
205 224 243 234 224 - в кодировке CP-1251;
141 160 227 170 160 - в кодировке CP-866.
В системе CP-1251 двоичный код этого слова имеет вид: 110011011110 0000111100111110101011100000, или cd e0 f3 ea e0 (hex).
Пример 24. Сообщение "Привет, мир!", написанное в кодировке CP-1251 и прочитанное в кодировке КОИ-8, будет выглядеть следующим образом: "оПХБЕР, ЛХП!". Этот же текст, написанный в кодировке КОИ-8, будет в кодировке CP-1251 иметь вид: "рТЙЧЕФ, НЙТ!".
В самом деле, в первом случае выражение "Привет, мир!" в десятичном виде кодируется так, как показано ниже ( табл. 2.6 и 2.8):
34 207 240 232 226 229 242 44 32 236 232 240 33 34
Если этот код декодировать с помощью таблиц 2.6 и 2.7, то получится строка "оПХБЕР, ЛХП!".
Во втором случае кодирование и декодирование выполняется аналогичным образом.
Стандарт универсальной системы кодирования Unicode (Юникод) был предложен в 1991 г. организацией Консорциум Юникода (Unicode Consortium). Сначала для кодирования символа в этой системе использовалось 2 байта, так что представить в ней можно было $$2^{16}$$, или 65536 значений. Символы обозначались четырьмя 16-ричными цифрами в виде U+04ff. Затем кодовая область была расширена. Применение стандарта позволяет закодировать большое число символов.
Стандарт системы Unicode содержит 2 основных раздела:
UCS (Universal Character Set) - универсальный набор символов;UTF (Unicode Transformation Format) - семейство кодировок.Универсальный набор символов UCS определяет соответствие символов кодам, а семейство кодировок UTF - представление последовательностей кодов в вычислительных устройствах.
Множество кодов образует кодовое пространство. Это пространство разделено на плоскости по $$2^{16}$$ символов. В нулевой плоскости, которая является базовой, расположены символы наиболее употребительных письменностей, в первой плоскости - исторические символы, и т. д. Символы нулевой плоскости занимают диапазон от U+0000 до U+ffff, первой плоскости - от U+10000 до U+1ffff, и так далее, до U+10ffff.
Символы каждой плоскости разделены на несколько областей. Например, область с кодами от U+0000 до U+007f содержит символы базовой таблицы ASCII. Буквы русского языка, кроме Ё и ё, имеют коды от U+0410 до U+044f; буква Ё имеет код U+0401, а буква ё - код U+0451.
Существует несколько форматов представления кодов символов системы Unicode. Например, представление системы UTF-8 обеспечивает наилучшую совместимость с системами, использующими 8-битные символы. Текст, состоящий только из символов, номера которых менее 128, при записи в UTF-8 преобразуется в обычный текст ASCII. И, наоборот, в кодах UTF-8 байт, значение которого менее 128, соответствует символу ASCII с тем же кодом. Остальные символы отображаются последовательностями длиной от 2 до 6 байт. В системе UTF-16 для кодирования Unicode-символов используется от 2 до 4 байт; всего она позволяет записать 1 112 064 символов. Система UTF-32 использует для кодирования каждого символа 4 байта, при этом символ является прямым представлением его кодовой позиции.
Рассмотрим способы, с помощью которых можно ввести символы в документ Office по их кодам, десятичным или 16-ричным, если на компьютере установлена операционная система Windows.
Первый способ - использовать Alt-код, который представляет собой десятичный код символа, вводящийся на цифровой клавиатуре при нажатой клавише Alt (цифровая клавиатура должна быть включена). Символ в документе отображается после отпускания клавиши Alt.
Отметим, что Alt-коды 32 - 255 соответствуют кодовой странице CP-866.
Пример 25. Удерживая клавишу Alt, введем на цифровой клавиатуре код 239, затем отпустим клавишу Alt. В результате появится буква я (табл. 2.9).
Если последовательно ввести .
Букву ё можно ввести как с помощью Alt-кода 241, так и с помощью Alt-кода 1105, так как эта буква в системе Unicode представлена 16-ричным кодом U+0451, что соответствует десятичному коду 1105.
Второй способ ввести символ с помощью кода - написать в документе 16-ричный код символа из таблицы Unicode и затем использовать сочетание клавиш Alt + X, чтобы преобразовать код в символ. Можно выполнить и обратное действие: чтобы отобразить код Unicode-символа, уже находящегося в документе, следует поместить курсор непосредственно после символа и нажать Alt + X.
Пример 26. Символ $$\frac{7}{8}$$ имеет код U+215e. Если в документе написать 215e (или U+215e) и затем использовать сочетание клавиш Alt + X, то код заменится символом $$\frac{7}{8}$$. После повторного нажатия Alt + X вместо этого символа появится код 215E.
Пример 27. Римские числа, приведенные ниже, можно ввести как с помощью 16-ричных кодов 2160 - 216f и сочетания клавиш Alt + X, так и с помощью Alt-кодов 8544 - 8559:
I II III IV V VI VII VIII IX X XI XII L C D M
Таблица символов Windows входит в состав операционной системы Windows. В этой таблице содержатся все символы для имеющихся в системе шрифтов. Для того чтобы поместить символ из этой таблицы в документ, его следует выделить, а затем использовать кнопки "Выбрать" и "Копировать" (и сочетание клавиш Ctrl+V).
Пример 28. Откроем таблицу символов и вставим их в документ. Первые два из них являются символами шрифта Cambria Math, третий - символом из Wingdings.
Найдите для числа (- 100) дополнительный код, если для двоичного кодирования используется следующее число байт:
a) 1;
b) 2;
c) 4.
Найдите дополнительный код при двоичном кодировании в 1 байте типа данных целых чисел со знаком числа:
a) - 5;
b) - 11;
c) - 17;
d) - 123.
Найдите дополнительный код числа (- 73) при p-ичном кодировании в 1 байте, если p равно
a) 2;
b) 8;
c) 10;
d) 16.
Найдите десятичное число, дополнительный двоичный код которого имеет вид:
a) 10010001;
b) 11001100;
c) 1100110101001010.
Найдите дополнительные коды и выполните операции сложения и вычитания в типе данных целых чисел со знаком при двоичном кодировании в 1 байте:
a) 22 - 35;
b) 35 - 22;
c) 22 + 35;
d) - 22 - 35.
Замените операцию вычитания операцией сложения дополнительных кодов, при десятичном кодировании, и вычислите:
a) 1024 - 736;
b) 736 - 1024;
c) 33 - 2222;
d) 2222 - 33.
Вычислите, заменив операцию вычитания операцией сложения дополнительных кодов при 16-ричном кодировании:
a) a1b4 - 7c35;
b) 7c35 - a1b4;
c) aaa - e;
d) e - aaa.
Приведите к 1) нормальной; 2) субнормальной форме число
a) - 22,22;
b) 0,0055;
c) $$1001,1001_2$$;
d) - 0,000001012.
Найдите p-ичное представление нормализованного числа
a) $$- 4,01e+5, p = 10;$$
b) $$6,7e-5, p = 10;$$
d) $$1,01_2 * 2^{- 5}, p = 2.$$
Выполните действие и приведите результат к той же форме, нормальной или субнормальной:
a) $$2,02e+4 + 1,1e+2; $$
b) $$2,22e+3 - 3,3e-2; $$
c) $$4,4e+3 * 7,7e-2; $$
d) $$2e-7 5e+3; $$
e) $$0,1_2 * 2^{-100} + 0,1_2 * 2^{-99};$$
f) $$0,1_2 * 2^{-100} - 0,1_2 * 2^{-101};$$
g) $$1,011_2 * 2^6 * 1,01_2 * 2^{- 4};$$
h) $$1,0_2 * 2^5 1,1_2 * 2^7. $$
Найдите представление числа 33,7, используя порядок записи байт 1) от старшего к младшему; 2) от младшего к старшему,
a) с одинарной точностью (в типе данных float);
b) с двойной точностью (в типе данных double).
Найдите десятичное число, представление которого с одинарной точностью (в типе данных float) имеет вид:
a) 40a38000 (hex);
b) 006a8000 (hex),
при записи байт от старшего к младшему.
С помощью таблицы ASCII найдите код
1) десятичный;
2) шестнадцатеричный;
3) двоичный
a) слова Wisdom;
b) фразы "Hello, World!";
c) выражения y = x^2 + ln(x).
Найдите текст, который в системе ASCII кодируется следующим образом:
0100010101110100011001010111001001101110011010010111010001111001;
66 6f 72 20 77 68 61 74 65 76 65 72 20 61 20 6d 61 6e 20 73 6f 77 73 2c 20 74 68 61 74 20 68 65 20 77 69 6c 6c 20 61 6c 73 6f 20 72 65 61 70 (hex).
Восстановите текст, написанный на русском языке:
оПХБЕРЯРБСЧ РЕАЪ, ОСЯРШММШИ СЦНКНЙ (ю.я. оСЬЙХМ)
Напишите фразу "Люблю грозу в начале мая", используя
a) Alt-коды символов;
b) 16-ричные коды и сочетание клавиш Alt + X.
Вставьте в документ Word, с помощью кодов символов и сочетания клавиш Ctrl+= и Ctrl+Shift++, выражение
a) $$H_2O$$;
b) $$2\pi r$$;
c) $$\pir^2$$;
d) $$\cos^2\alpha + \sin^2\alpha = 1$$.
Вставьте в документ из таблицы символов Windows символ
a) $$\Bbb R$$;
b)
;
c) $$\frac56$$
d)
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.