Представление целых чисел
В языках C/C++ для хранения целых чисел выделяется фиксированный размер памяти (в отличии от, например, языка Python, где целые числа имеют произвольную длину, ограниченную только возможностями компьютера). Например, если для хранения целочисленной переменной выделено 4 байта (32 бита), то эта переменная может принимать \(2^\) различных значений. В таких языках программирования, как C/C++ или Pascal бывают два вида целочисленных типов данных — знаковые и беззнаковые типы. В беззнаковом типе данных хранятся только неотрицательные значения. Минимальное беззнаковое значение, которое можно сохранить в такой переменной, записывается нулевыми битами и соответствует числу 0. Максимальное значение, которое можно записать в такой переменной, кодируется одними единицами и для 32-битной переменной равно \(2^-1\). Далее в таблице приведены названия различных беззнаковых целых типов для различных языков программирования.
unsigned int, unsigned long
unsigned long long
unsigned long, unsigned long long
Представление знаковых целых чисел (дополнительный код)
Для представления знаковых типов данных используется дополнительный код. Такое представление данных удобно для реализации арифметических операций с целыми числами. В дополнительном коде число -1 кодируется одними единичными битами. В этом случае при увеличении числа -1 на 1, как если бы это увеличение происходило в двоичной системе счисления «в столбик», все биты обнулятся и произойдет перенос в старший разряд, который не может быть сохранен в переменной данного типа и получится число 0. Аналогично, число -2 представляется в памяти, как 11. 110, и при увеличении этого числа на 1 получится число -1. Число -3 кодируется, как 11. 101 и т. д. Минимальное значение, которое может быть в данном случае записано в переменной знакового типа представляется в памяти, как 100. 000, оно соответствует значению \(-2^\) для 32-битного типа, это — минимальное отрицательноые число, представимое в данном типе. А значение 011. 11 соответствует положительному числу \(2^-1\), и это максимальное положительное число, которое представимо в таком типе.
Также можно заметить, что для преставления отрицательного числа \(-n\) необходимо взять двоичное представление числа \(n\), уменьшить его на 1, затем инвертировать все биты числа (заменить значение 0 на 1 и заменить 1 на 0). Такая операция также назыается дополнением, поэтому и код называется дополнительным.
Ниже приведена таблица различных знаковых типов.
1. Представление целых чисел
Тебе известно, что компьютер работает только с двоичным кодом. \(0\) и \(1\) обозначают два устойчивых состояния: вкл/выкл, есть ток/нет тока и т. д. Оперативная память представляет собой контейнер, который состоит из ячеек. В каждой ячейке хранится одно из возможных состояний: \(0\) или \(1\). Одна ячейка — \(1\) бит информации или представляет собой разряд некоторого числа.

Целые числа в памяти компьютера хранятся в формате с фиксированной запятой . Такие числа могут храниться в \(8\), \(16\), \(32\), \(64\)-разрядном формате.
Для целых неотрицательных чисел в памяти компьютера выделяется \(8\) ячеек (бит) памяти.
Минимальное число для такого формата: \(00000000\). Максимальное: \(11111111\).
Переведём двоичный код в десятичную систему счисления и узнаем самое большое число, которое можно сохранить в восьмибитном формате.
1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0 = 255 10 .
Если целое неотрицательное число больше \(255\), то оно будет храниться в \(16\)-разрядном формате и занимать \(2\) байта памяти, то есть \(16\) бит.
Подумай! Какое самое большое число можно записать в \(16\)-разрядном формате?
Чем больше ячеек памяти отводится под хранение числа, тем больше диапазон значений.
В таблице указаны диапазоны значений для \(8\), \(16\) и \(32\)-разрядных форматов.

Для \(n\)-разрядного представления диапазон чисел можно вычислить следующим образом: от \(0\) до 2 n − 1 .
Запишем целое беззнаковое число \(65\) в восьмиразрядном представлении. Достаточно перевести это число в двоичный код.
65 10 = 1000001 2 .
![]()
Оставшиеся пустыми слева ячейки заполняем нулями.
Это же число можно записать и в \(16\)-разрядном формате.
![]()
Для целых чисел со знаком в памяти отводится \(2\) байта информации (\(16\) бит). Старший разряд отводится под знак: \(0\) — положительное число; \(1\) — отрицательное число. Такое представление числа называется прямым кодом.
Представим число \(65\) в знаковом формате.

Для хранения отрицательных чисел используют дополнительный и обратный коды, которые упрощают работу процессора. Но об этом ты узнаешь в старших классах.
Представление числовых данных в памяти ЭВМ
Для представления информации в памяти ЭВМ (как числовой, так и не числовой) используется двоичный способ кодирования.
Элементарная ячейка памяти ЭВМ имеет длину 8 бит (байт). Каждый байт имеет свой номер (его называют адресом ). Наибольшую последовательность бит, которую ЭВМ может обрабатывать как единое целое, называют машинным словом . Длина машинного слова зависит от разрядности процессора и может быть равной 16, 32, 64 битам и т.д.
Кодирование символов
Для кодирования символов достаточно одного байта. При этом можно представить 256 символов (с десятичными кодами от 0 до 255). Набор символов персональных ЭВМ, совместимых с IBM PC, чаще всего является расширением кода ASCII (American Standard Code for Information Interchange стандартный американский код для обмена информацией). В настоящее время используются и двухбайтовые предсталения символов.
Двоично-десятичное кодирование
В некоторых случаях при представлении чисел в памяти ЭВМ используется смешанная двоично-десятичная «система счисления», где для хранения каждого десятичного знака нужен полубайт (4 бита) и десятичные цифры от 0 до 9 представляются соответствующими двоичными числами от 0000 до 1001. Например, упакованный десятичный формат, предназначенный для хранения целых чисел с 18-ю значащими цифрами и занимающий в памяти 10 байт (старший из которых знаковый), использует именно этот вариант.
Представление целых чисел в дополнительном коде
Другой способ представления целых чисел дополнительный код . Диапазон значений величин зависит от количества бит памяти, отведенных для их хранения. Например, величины типа Integer (все названия типов данных здесь и ниже представлены в том виде, в каком они приняты в языке программирования Turbo Pascal. В других языках такие типы данных тоже есть, но могут иметь другие названия) лежат в диапазоне от -32768 (-2 15 ) до 32767 (2 15 — 1) и для их хранения отводится 2 байта (16 бит); типа LongInt в диапазоне от -2 31 до 2 31 — 1 и размещаются в 4 байтах (32 бита); типа Word в диапазоне от 0 до 65535 (2 16 — 1) (используется 2 байта) и т.д.
Как видно из примеров, данные могут быть интерпретированы как числа со знаком , так и без знака . В случае представления величины со знаком самый левый (старший) разряд указывает на положительное число, если содержит нуль, и на отрицательное, если единицу.
Вообще, разряды нумеруются справа налево, начиная с 0. Ниже показана нумерация бит в двухбайтовом машинном слове.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Дополнительный код положительного числа совпадает с его прямым кодом . Прямой код целого числа может быть получен следующим образом: число переводится в двоичную систему счисления, а затем его двоичную запись слева дополняют таким количеством незначащих нулей, сколько требует тип данных, к которому принадлежит число.
Например, если число 37 (10) = 100101 (2) объявлено величиной типа Integer ( шестнадцатибитовое со знаком ), то его прямым кодом будет 0000000000100101, а если величиной типа LongInt ( тридцатидвухбитовое со знаком ), то его прямой код будет 00000000000000000000000000100101. Для более компактной записи чаще используют шестнадцатеричное представление кода. Полученные коды можно переписать соответственно как 0025 (16) и 00000025 (16) .
Дополнительный код целого отрицательного числа может быть получен по следующему алгоритму:
- записать прямой код модуля числа;
- инвертировать его (заменить единицы нулями, нули единицами);
- прибавить к инверсному коду единицу.
Например, запишем дополнительный код числа -37, интерпретируя его как величину типа LongInt (тридцатидвухбитовое со знаком):
- прямой код числа 37 есть 00000000000000000000000000100101;
- инверсный код 11111111111111111111111111011010;
- дополнительный код 11111111111111111111111111011011 или FFFFFFDB(16).
При получении числа по его дополнительному коду прежде всего необходимо определить его знак. Если число окажется положительным, то просто перевести его код в десятичную систему счисления. В случае отрицательного числа необходимо выполнить следующий алгоритм:
- вычесть из кода числа 1;
- инвертировать код;
- перевести в десятичную систему счисления. Полученное число записать со знаком минус.
Примеры. Запишем числа, соответствующие дополнительным кодам:
- 0000000000010111. Поскольку в старшем разряде записан нуль, то результат будет положительным. Это код числа 23.
- 1111111111000000. Здесь записан код отрицательного числа. Исполняем алгоритм: 1) 1111111111000000(2) — 1(2) = 1111111110111111(2); 2) 0000000001000000; 3) 1000000(2) = 64(10).
Ответ: -64.
Кодирование вещественных чисел
Несколько иной способ применяется для представления в памяти персонального компьютера действительных чисел. Рассмотрим представление величин с плавающей точкой.
Любое действительное число можно записать в стандартном виде M × 10 p , где 1 £ M p целое. Например, 120100000 = 1,201 × 10 8 . Поскольку каждая позиция десятичного числа отличается от соседней на степень числа 10, умножение на 10 эквивалентно сдвигу десятичной запятой на одну позицию вправо. Аналогично деление на 10 сдвигает десятичную запятую на позицию влево. Поэтому приведенный выше пример можно продолжить: 120100000 = 1,201 × 10 8 = 0,1201 × 10 9 = 12,01 × 10 7 . Десятичная запятая «плавает» в числе и больше не помечает абсолютное место между целой и дробной частями.
В приведенной выше записи M называют мантиссой числа, а p его порядком. Для того чтобы сохранить максимальную точность, вычислительные машины почти всегда хранят мантиссу в нормализованном виде, что означает, что мантисса в данном случае есть число, лежащее между 1(10) и 2(10) (1 £ M
| Тип | Диапазон | Мантисса | Байты |
|---|---|---|---|
| Real | 2,9×10 -39 ..1,7×10 38 | 11-12 | 6 |
| Single | 1,5×10 -45 ..3,4×10 38 | 7-8 | 4 |
| Double | 5,0×10 -324 ..1,7×10 308 | 15-16 | 8 |
| Extended | 3,4×10 -4932 ..1,1×10 4932 | 19-20 | 10 |
Покажем преобразование действительного числа для представления его в памяти ЭВМ на примере величины типа Double.
Как видно из таблицы, величина это типа занимает в памяти 8 байт. На рисунке ниже показано, как здесь представлены поля мантиссы и порядка (нумерация битов осуществляется справа налево):
| S | Смещенный порядок | Мантисса |
| 63 | 62..52 | 51..0 |
Можно заметить, что старший бит, отведенный под мантиссу, имеет номер 51, т.е. мантисса занимает младшие 52 бита. Черта указывает здесь на положение двоичной запятой. Перед запятой должен стоять бит целой части мантиссы, но поскольку она всегда равна 1, здесь данный бит не требуется и соответствующий разряд отсутствует в памяти (но он подразумевается). Значение порядка хранится здесь не как целое число, представленное в дополнительном коде. Для упрощения вычислений и сравнения действительных чисел значение порядка в ЭВМ хранится в виде смещенного числа, т.е. к настоящему значению порядка перед записью его в память прибавляется смещение. Смещение выбирается так, чтобы минимальному значению порядка соответствовал нуль. Например, для типа Double порядок занимает 11 бит и имеет диапазон от 2 -1023 до 2 1023 , поэтому смещение равно 1023(10) = 1111111111(2). Наконец, бит с номером 63 указывает на знак числа.
Таким образом, из вышесказанного вытекает следующий алгоритм для получения представления действительного числа в памяти ЭВМ:
- перевести модуль данного числа в двоичную систему счисления;
- нормализовать двоичное число, т.е. записать в виде M × 2 p , где M мантисса (ее целая часть равна 1(2)) и p порядок, записанный в десятичной системе счисления;
- прибавить к порядку смещение и перевести смещенный порядок в двоичную систему счисления;
- учитывая знак заданного числа (0 положительное; 1 отрицательное), выписать его представление в памяти ЭВМ.
Пример. Запишем код числа -312,3125.
- Двоичная запись модуля этого числа имеет вид 100111000,0101.
- Имеем 100111000,0101 = 1,001110000101 × 2 8 .
- Получаем смещенный порядок 8 + 1023 = 1031. Далее имеем 1031(10) = 10000000111(2).
- Окончательно
1 10000000111 0011100001010000000000000000000000000000000000000000 63 62..52 51..0
Очевидно, что более компактно полученный код стоит записать следующим образом: C073850000000000(16).
Другой пример иллюстрирует обратный переход от кода действительного числа к самому числу.
- Прежде всего замечаем, что это код положительного числа, поскольку в разряде с номером 63 записан нуль. Получим порядок этого числа: 01111111110(2) = 1022(10); 1022 — 1023 = -1.
- Число имеет вид 1,1100011 × 2 -1 или 0,11100011.
- Переводом в десятичную систему счисления получаем 0,88671875.
См. также стандарт IEEE 754
Сколько бит занимает число
Калькулятор подсчитывает число бит, нужное для записи заданного целого числа в двоичном виде, число может быть очень большим.
Этот калькулятор можно использовать для подсчета знаков, необходимых для записи большого числа в двоичном виде (число бит). Также выдается какой объем памяти требуется для хранения этого числа в памяти компьютера (число байт). Кроме этого калькулятор определяет число разрядов для вывода числа в восьмеричном, в десятичном и шестнадцатеричном виде и выводит исходное число в этих системах счисления.
Сколько бит в большом целом
Большое целое
Рассчитать
Двоичное представление
Восьмеричных разрядов
Восьмеричное представление
Десятичных разрядов
Десятичное представление
Шестнадцатеричных разрядов
Шестнадцатеричный код
Число байт
Ссылка Сохранить Виджет
Ограничения на длину числа нет — максимум зависит только от ресурсов вашего компьютера.
К примеру, число с одной тысячей нулей можно ввести вот так: 123E1000
Калькулятор вычисляет число двоичных разрядов путем преобразования числа в двоичную строку и последующего вычисления ее длины.
На практике такой способ неэффективен. Реализация более эффективного алгоритма поиска позиции старшего значащего бита во многом зависит от представления числа в памяти компьютера и сложности выполнения тех или иных операций.
Например, математически число бит можно вычислить путем округления в большую сторону логарифма по основанию 2 от заданного числа плюс 1: