Вещественные числа (числа с плавающей точкой)
Знак
Все равные по абсолютному значению положительные и отрицательные числа отличаются только этим битом. В остальном числа с разным знаком полностью одинаковы. Для представления отрицательных чисел здесь не используется дополнительный код.
Мантисса
Поле мантиссы содержит мантиссу нормализованного числа.
Нормализованное число, это число, у которого в целой части одна цифра (раз число двоичное, это всегда 1 и она не хранится в памяти компьютера, только подразумевается), а остальные цифры после запятой.
Таким образом, в память записываются цифры мантиссы, начиная со второй и справа дополняются нулями.
Порядок
У нашего числа порядок может быть положительным и отрицательным (если само число меньше 1). Но в секции порядка не предусмотрен отдельный бит для знака. Поэтому порядок наращивается на такую величину, чтобы он гарантированно был положительным.
для 8 бит – на 127
для 11 бит – на 1023
для 15 бит – на 16383
Таким образом, извлекая число из памяти, мы делаем следующие преобразования:
Одинарная точность:
1.(цифры мантиссы)*2(P-127)
Двойная точность:
1.(цифры мантиссы)*2(P-1023)
Расширенная точность:
1.(цифры мантиссы)*2(P-16383)
Пример.
Запишите код действительного числа, интерпретируя его как величину типа float.
а) 446,15625;
Переводим десятичное число в двоичное представление.
Целая часть от деления |
Остаток от деления |
446 div 2 = 223 |
446 mod 2 = 0 |
223 div 2 = 111 |
223 mod 2 = 1 |
111 div 2 = 55 |
111 mod 2 = 1 |
55 div 2 = 27 |
55 mod 2 = 1 |
27 div 2 = 13 |
27 mod 2 = 1 |
13 div 2 = 6 |
13 mod 2 = 1 |
6 div 2 = 3 |
6 mod 2 = 0 |
3 div 2 = 1 |
3 mod 2 = 1 |
1 div 2 = 0 |
1 mod 2 = 1 |
Остаток от деления записываем в обратном порядке. Получаем число в 2-ой системе счисления: 110111110
446 = 1101111102
Для перевода дробной части числа последовательно умножаем дробную часть на основание 2. В результате каждый раз записываем целую часть произведения.
0.15625*2 = 0.3125 (целая часть 0)
0.3125*2 = 0.625 (целая часть 0)
0.625*2 = 1.25 (целая часть 1)
0.25*2 = 0.5 (целая часть 0)
0.5*2 = 1 (целая часть 1)
Получаем число в 2-ой системе счисления: 00101
0.15625 = 0.001012
446.15625 = 110111110.001012= 1.10111110001012*28
Знак S = 0
Порядок P = 8 + 127=135=
Мантисса: 1011111000101
Для числа с двойной точностью мантисса занимает 52 разряда. Добавляем нули.
Мантисса: 1011 1110 0010 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Запишем число:
0 10000000111 1011 1110 0010 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000
В шестнадцатеричной системе счисления: 407BE2800000000016
Битовые операции
При любых операциях биты, переходящие за левую границу числа, теряются.
Операция инвертирования ~
Все биты меняются на противоположные, кроме знакового.
Операции сдвига
7 << 2
7 >> 2
Логические операции
их всего 2
логическое сложение (or, ||) истина, если хотя бы один аргумент истина
логическое умножение (and, &&) истина, если оба аргументы истинны
битовая
исключающее или (xor, ^) истина, если аргументы разные
Результат логической операции – всегда 0 или 1.
В языке С++ при выполнении логических операций только 0 интерпретируется как ложь. Любое другое число – истина. (это для аргументов)
Битовые операции
Аналогичны логическим, но выполняются над парами битов
| & ^
10 | 7
0000 1010
0000 0111
0000 1111 = 15
10 & 7
0000 1010
0000 0111
0000 0010 = 2
10 ^ 7
0000 1010
0000 0111
0000 1101 = 13
Но 10 || 7 = 1
10 && 7 = 1