Форматы представления чисел в компьютере
Для хранения чисел в памяти компьютера используется два формата: целочисленный (естественная форма) и с плавающей точкой (нормализованная форма) (точка — разделительный знак для целой и дробной части числа).
Целочисленный формат (формат с фиксированной точкой) используется для представления в компьютере целых (англ. integer) положительных и отрицательных чисел. Для этого, как правило, используются форматы, кратные байту: 1, 2, 4 байта.
В форме с фиксированной запятой числа изображаются в виде последовательности цифр с постоянным для всех чисел положением запятой (или точки), отделяющей целую часть от дробной.
Эта форма проста и привычна для большинства пользователей, но имеет небольшой диапазон представления чисел и поэтому не всегда пригодна при вычислениях. Если же в результате какой-либо арифметической операции получается число, выходящее за допустимый диапазон, то происходит переполнение разрядной сетки, и все дальнейшие вычисления теряют смысл.
Однобайтовое представление применяется только для положительных целых чисел. В этом формате отсутствует знаковый разряд. Наибольшее двоичное число, которое может быть записано при помощи 1 байта, равно 11111111, что в десятичной системе счисления соответствует числу 255(10).
Для положительных и отрицательных целых чисел обычно используется 2 и 4 байта, при этом старший бит выделяется под знак числа: 0 - плюс, 1 - минус.
Самое большое (по модулю) целое число со знаком, которое может поместиться в 2-байтовом формате, это число 0111111111111111, то есть при помощи подобного кодирования можно представить числа от −32 768(10) до 32 767(10).
Обрати внимание!
Если число вышло за указанные границы, произойдет переполнение! Поэтому при работе с большими целыми числами под них выделяется больше места, например 4 байта.
Формат с плавающей точкой (нормализованная форма) используется для представления в компьютере действительных чисел (англ. real). Числа с плавающей точкой размещаются, как правило, в 4 или 8 байтах.
Нормализованная форма представления чисел обеспечивает огромный диапазон их записи и является основной в современных ЭВМ.
Представление целого положительного числа в компьютере
Для представления целого положительного числа в компьютере используется следующее правило:
- число переводится в двоичную систему;
- результат дополняется нулями слева в пределах выбранного формата;
- последний разряд слева является знаковым, в положительном числе он равен 0.
Например, положительное число +13510 в зависимости от формата представления в компьютере будет иметь следующий вид:
- для формата в виде 1 байта - 10000111 (отсутствует знаковый разряд);
- для формата в виде 2 байтов - 0000000010000111;
- для формата в виде 4 байтов - 00000000000000000000000010000111.
Представление целого отрицательного числа в компьютере
Для представления целого отрицательного числа в компьютере используется дополнительный код. Такое представление позволяет заменить операцию вычитания числа операцией сложения с дополнительным кодом этого числа. Знаковый разряд целых отрицательных чисел всегда равен 1.
Для представления целого отрицательного числа в компьютере используется следующее правило:
- число без знака переводится в двоичную систему;
- результат дополняется нулями слева в пределах выбранного формата;
- полученное число переводится в обратный код (нули заменяются единицами, а единицы - нулями);
- к полученному коду прибавляется 1.
Обратный код для положительного двоичного числа совпадает с его прямым кодом, а для отрицательного числа нужно во всех разрядах, кроме знакового, нули заменить единицами и наоборот.
Дополнительный код для положительного числа совпадает с его прямым кодом, а для отрицательного числа образуется путем прибавления 1 к обратному коду.
Отрицательное число может быть представлено в виде 2 или 4 байт.
Например, представим число −135(10) в 2-байтовом формате:
- 135(10) →1000 0111 (перевод десятичного числа без знака в двоичный код);
- 0000 0000 1000 0111(дополнение двоичного числа нулями слева в пределах формата);
- 0000 0000 1000 0111 → 1111 1111 0111 1000 (перевод в обратный код);
- 1111 1111 0111 1000 → 1111 1111 0111 1001 (перевод в дополнительный код).
Представление вещественного (действительного) числа в компьютере
Вещественное число может быть представлено в экспоненциальном виде, например:
16000000(10) = 0,16⋅10^8
−0,0000156(10)=−0,156⋅10^−4
В этом формате вещественное число (R) представляется в виде произведения мантиссы (m) и основания системы счисления (P) в целой степени (n), называемой порядком.
Представим это в общем виде, как: R=m⋅P^n.
Порядок n указывает, на какое количество позиций и в каком направлении должна сместиться в мантиссе точка (запятая), отделяющая дробную часть от целой. Мантисса, как правило, нормализуется, то есть представляется в виде правильной дроби 0 < m < 1.
Мантисса должна быть правильной дробью, у которой первая цифра после точки (запятой в обычной записи) отлична от нуля. Если это требование выполнено, то число называется нормализованным.
Для размещения вещественного числа обычно используется 2 или 4 байта.
В 2-байтовом формате представления вещественного числа первый байт и три разряда второго байта выделяются для размещения мантиссы, в остальных разрядах второго байта размещаются порядок числа, знаки числа и порядка.
В 4-байтовом формате представления вещественного числа первые три байта выделяются для размещения мантиссы, в четвертом байте размещаются порядок числа, знаки числа и порядка.
Чем больше разрядов отводится под запись мантиссы, тем выше точность представления числа.
Пример записи числа 6,25(10) = 110,01(2) = 0,11001⋅2^11, представленного в нормализованном виде, в четырёхбайтовом формате с семью разрядами для записи порядка.
Практические примеры
В числах одинарной точности:
на знак отводится 1 бит, на экспоненту - 8, на мантиссу - 23.
В нормализованных числах старший бит всегда равен единице и он не записывается в число, поэтому реально мантисса для таких чисел имеет размер 24 бита.
К экспоненте перед записью добавляется число 127.
Для начала запишем знак числа. Если число положительное - запишем в знак 0, если отрицательное - 1 и отбросим знак числа для дальнейших вычислений.
Далее приведем число к такому виду, что перед запятой в двоичной записи у него только единица (если изначальное число 0 - оно имеет специальную запись 0 00000000 00000000000000000000000₂)
Для этого либо умножаем число на 2 пока оно не станет >= 1, если оно меньше 1, либо делим на 2 пока оно все еще >= 1.
Если умножаем - в экспоненту пойдет отрицательное число умножений.
Если делим - положительное число делений.
Потом получившееся число умножаем на 2²³ (8388608), округляем до ближайшего целого и отбрасываем старший бит. Результат записываем в мантиссу.
Пример 1
0,5 - положительное, в знак 0
0,5 < 1, умножаем его на 2, пока оно не станет >= 1. получилось 1 за 1 умножение. в экспоненту пойдет -1
мантисса = 1*8388608 = 100000000000000000000000₂
отбрасываем старший бит. получается 000000000000000000000000₂
записываем:
знак = 0 (число положительное)
в экспоненте 127 - 1 = 126 = 01111110₂
в мантиссе 000000000000000000000000₂
(без старшей единицы),получаем:
0 01111110 00000000000000000000000₂
Пример 2
25,12 положительное. в знак 0
25,12 делим на 2, пока >= 1. получаем 1,57 за 4 деления (если поделим еще раз, будет уже 0,785 < 1). в экспоненту пойдет +4.
1,57 * 8388608 = 13170114,56. округляем, получаем 13170115 = 110010001111010111000011₂
отбрасываем старший бит, получаем 10010001111010111000011₂
записываем
знак = 0
экспонента = 127+4 = 10000011₂
мантисса = 10010001111010111000011₂
получаем:
0 10000011 10010001111010111000011₂
-25,12 отрицательное, записываем в знак единицу, далее отбрасываем знак числа и считаем ровно как в предыдущем примере
1 10000011 10010001111010111000011₂
Пример 3
-3456,1. в знак единица, отбрасываем знак.
3456,1 > 1. делим на 2¹¹. получаем 1.687548828125, в экспоненту 11
1.687548828125 * 8388608 = 14156185.6.
округляем. 14156186 = 1101 1000 0000 0001 1001 1010₂, отбрасываем старшую единицу: 101 1000 0000 0001 1001 1010₂
знак 1
экспонента 127 + 11 = 10001010₂
мантисса 10110000000000110011010₂
результат 1 10001010 10110000000000110011010₂
