Как компьютер превращает двоичный код, скажем, 110011 (51), в соответствующие значения ASCII, 53 ('5') и 49 ('1')? Кроме того, как компьютер поворачивается на 53 и 49 назад до 110011?Двоичные десятичные числа в компьютерах
ответ
Преобразование двоичных чисел в десятичные числа обычно работает как цикл повторного разделения. Если мы начнем с числа N, (N mod 10) будет последней цифрой, а затем мы продолжим деление N на 10 и повторение, чтобы получить другие цифры.
- Начнем с N = 51
- 51 мод 10 1. Конечный цифра 1.
- Деление на 10, чтобы отбросить цифру мы просто извлеченную (целочисленное деление раундов), давая 5.
- (это повторение шага 2 с разным N) 5 mod 10 равно 5. Следующая цифра равна 5.
- 5/10 - 0 (округление), и поэтому мы закончили. Цифры в обратном порядке: 1 и 5.
- Мы добавляем по 48 каждому значению цифры, чтобы получить соответствующие десятичные цифры в ASCII.
- Итак, конечный результат - «51».
Преобразование из строки во внутреннее представление еще проще.
- Старт с 0 в аккумуляторе
- Возьмите первый символ (здесь "5"). Это ASCII 53. Вычитайте 48, чтобы получить 5.
- Добавьте к нашему аккумулятору, чтобы получить 0 + 5 = 5.
- Обратите внимание, что есть еще одна цифра. Умножьте аккумулятор на 10, чтобы получить 50.
- Вернитесь к шагу 1
В следующей итерации (т.е. для "1" = ASCII 49) Вычесть 48 раз: 49-48 = 1. Мы добавляем 1 к аккумулятору, давая 51. Больше никаких символов, поэтому мы закончили, и результат равен 51.
Тот факт, что внутреннее представление компьютера является двоичным, является случайным. Нам нужно только добавить, вычесть и умножить, чтобы преобразовать строку в число внутри компьютера.
(Конечно вычитание просто добавление отрицательного числа и умножения просто последовательность дополнений, так что добавление это все, что действительно необходимо.)
Он не поворачивает их в любом случае. 53
всегда является памятью 53
.
Что происходит, когда нужно отобразить, вызывается функция, которая знает, что когда она видит номер 53
, она генерирует графику, которую наши глаза видят как 5
. Или в памяти он может превратить номер 53
в номера 53
и 51
, которые в конечном итоге будут отображены в виде символов "5"
и "3"
.
И 53
всегда 110101
. Ячейка памяти представляет собой последовательность бит и содержит десятичные значения 53
как биты 001101011
.
Опять же, есть функции, которые видят эти биты и могут генерировать на экране символ "5"
и символ "3"
.
Но внутри компьютера всегда его номера и его всегда двоичные.
Итак, вы говорите, что компьютеры не вычисляют с использованием 51, а вместо этого имеют несколько разных чисел 53 и 49, которые используются для вычислить? – beary605
Ум нет. Например, fprintf/String.format принимает двоичные целые числа в памяти и создает символьные строки в памяти. Нет «графики». – bmargulies
Но как он «создает символьные строки в памяти», используя двоичные целые числа? – beary605
Попробуйте написать компьютерную программу для этой цели. Обычно это делается в программном обеспечении, хотя некоторые процессоры имеют целевые десятичные инструкции специального назначения. Просто притворись, что твоя работа - смотреть на бумажки с бинарными целыми числами на них и производить надписи на бумаге с кодовыми точками Юникода на них, и у тебя будет базовый план в кратчайшие сроки.
Дело в том, что я не знаю, как это сделать. Вот почему я спрашиваю. – beary605
Сначала вам нужно цифра единиц. Это ваш номер mod 10, индексированный в массив символов 0-9. Затем вам нужно получить цифру 10. Затем цифра 100 ... Просто подумайте об алгебре, разделив число на свои цифры. скачайте открытый исходный код glibc и прочитайте исходный код itoa. – bmargulies
Чтобы включить двоичный в ASCII:
1) принять ваш номер делит его на 10 десятичных (1010 двоичных) и вычисляет остаток . 2) С остатком добавьте 48 (значение ASCII для «0»). Это дает вам последнюю цифру. 3) Если коэффициент равен 0, остановите . 4) Если коэффициент больше 0, начните снова с шага 1 с использованием коэффициента.
Например. Преобразовать 51 (110011) в ASCII с использованием основы 10 (1010):
110011/1010 = 0101 (5 decimal) remainder 0001
0001 (the remainder from above) + 110000 ('0') = 110001 (49 decimal or '1' in ASCII)
0101 (the quotient from above)/1010 = 0 remainder 0101
0101 (the remainder) + 110000 ('0') = 110101 (53 decimal or '5' in ASCII)
Спасибо, это то, что я искал. – beary605
Думаю, вам нужно исправить некоторый modulo vs. division в первой части вашего ответа. Я знал, что вы значит, вы действительно не следовали за с логикой в шагах, и использовали по модулю и делению взаимозаменяемые. – bcdan