TGViewer
DEV: Рубиновые тона DEV: Рубиновые тона @dev_in_ruby_colors · 3.28K subscribers
Post #966 1.28K
Как числа представлены в компьютере?

Это немаловажный вопрос, ответ на который состоит из нескольких частей. Дело в том, что у нас есть обычные неотрицательные целые числа (то есть от 0 и далее, без дробной части), просто целые числа (которые могут быть отрицательными или положительными), а также дробные, которые тоже могут быть отрицательными или положительными.

Проще всего, конечно, с целыми неотрицательными числами. Так как мы, опять же, работаем только с нулями и единицами, то привычные нам десятичные числа в компьютере могут быть закодированы в виде вектора, состоящего из набора 0-1, в общем случае:

[ x(w - 1), x(w - 2), ... x(0) ]


w - длина вектора. Естественно, чем больше длина этого вектора, тем больше чисел мы можем с его помощью закодировать. В этом векторе наиболее значимый бит x(w-1) находится слева, а наименее значимый x(0) - справа. Если бит имеет значение 1, то он "привносит" в закодированное значение 2 ** i, где i - его порядковый номер. Собственно говоря, именно на этом факте строится процесс перевода из двоичного вида в десятичный.

Чтобы было проще, возьмём w = 4 и двоичное число 1010. Наиболее значимый бит имеет порядковый номер 3 (считаем с нуля), также у нас установлен в значение 1 бит под номером 1. Следовательно:

2 ** 3 + 2 ** 1 = 10


Это можно легко проверить, например, в Rust:

let number: u8 = 10;

println!("{number:b}");


Таким образом, числу 10 соответствует вектор 1010, но верно и обратное. Больше того, это соответствие "один ко одному", то есть в данном случае 1010 никакое другое число не представляет. Такая штука называется биекция.

При w = 4 минимальное число, которое мы можем закодировать 0 0 0 0, то есть просто 0, а максимальное - 1 1 1 1, то есть 15 (аналогично, для w = 8 максимальное число - это 255).

В общем, здесь всё просто и довольно очевидно. Интереснее становится, когда мы переходим к **целым числам, имеющим знак** (то есть они могут быть отрицательными). Где и как нам этот знак хранить? Раньше мы несколько обходили этот момент, говоря, что отдельный бит резервируется под хранение знака. Это некое упрощение.

На самом деле, вариантов представления чисел со знаком есть некоторое количество (в том числе, и случай, когда наиболее значимый бит просто говорит "есть минус или нет минуса"). Но, пожалуй, самый распространённый принцип - это так называемый "two's complement". Суть довольно проста.

У нас опять есть вектор из нулей и единиц указанной длины, предположим, 1 0 1 1.

Все биты, за исключением наиболее значимого, интерпретируются как и раньше, то есть "привносят" в значение 2 ** i:

2 ** 1 + 2 ** 0 = 2 + 1 = 3


Наиболее значимый бит (запишем его как X) имеет специальное назначение, и он фигурирует в выражении:

-X * (2 ** (w - 1))


В нашем случае выходит:

-1 * (2 ** 3) = -8


Полученное значение затем просто суммируется с тем, что мы получили после обработки всех битов, кроме наиболее значимого:

-8 + 3 = - 5


Следовательно, 1011 = -5.

Если X = 0, то формула выше обращается в ноль, и наше число будет неотрицательным. К примеру, 0 1 0 1 = 2 ** 2 + 2 ** 0 = 5.

Можно сказать, что при такой кодировке X "тянет" наше число в сторону отрицательных значений, а другие биты "тянут" его обратно на положительную сторону. Следовательно, наименьшее значение получится, когда X тянет нас в отрицательную сторону, но все остальные биты отсутствуют:

1 0 0 0 = -(2 ** 3) = -8


То есть при w = 4 наименьшее значение будет -8.

Максимальное значение получается, когда "знаковый" бит равен нулю, зато есть все остальные, которые тянут нас в положительную сторону:

0 1 1 1 = 2 ** 2 + 2 ** 1 + 2 ** 0 = 4 + 2 + 1 = 7


Аналогично, при w = 8 диапазон будет от -128 до 127. К примеру,

let number: i8 = -128;
println!("{number:b}");


вернёт 10000000.

А теперь важный момент: мы понимаем, что **наш вектор из битов можно рассматривать по-разному**. Если мы считаем, что наиболее значимый бит используется для хранения информации о знаке, то, к примеру, число 10110100 равно -76. Но если мы считаем, что речь идёт о неотрицательных числах, то это 180!
  • 🔥 7
  • ❤ 5
  • ✍ 2
  • 👍 2
  • 🥰 1
More from @dev_in_ruby_colors
  1. Sep 28, 2026Github буйствует
  2. Sep 26, 2026В этом уроке по абстрактной алгебре говорим про области целостности, делители нуля, характ…
  3. Sep 22, 2026А тем временем сказ о ведьмаке, потерявшем память, уже доступен в виде аудиокниги. Целых 1…
  4. Sep 20, 2026В этом уроке по абстрактной алгебре продолжаем говорить о кольцах: в частности о subrings…
  5. Sep 17, 2026Сделал обзор актуальных библиотек JS для сбора данных, 10 штук бодрых решений на все случа…
  6. Sep 13, 2026В общем, мне тут особо было нечего делать и я подумал создать небольшой скрипт для решения…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →