Как система понимает какие глифы шрифта нужно вывести на экран для представления двоичного числа?
Допустим, что в памяти хранится двоичное число 10111111100 (1532 в десятичной системе счисления). Но это число нужно вывести на экран, используя глифы (какого-либо шрифта), соответствующие цифрам 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. То есть каждый из этих глифов имеет определенный код символа, но как все-таки компьютерная система понимает, что нужно выбрать именно глифы 1, 5, 3 и 2? Это является загадкой для меня.
Кажется(? xD ) тут нужно углубляться в процесс создания шрифта и изучать наработанные алгоритмы его отображения, чтобы понять как лучше представить картинку пользователю ОС. Вот интересное видео, почти в тему
Непонятно зачем автор обсуждает глифы и шрифты? Данная задача состоит из двух частей.
1) Преобразование двоичного числа (например int) в строковое представление двоичного числа.
2) Печать этой строки на экране используя (или не используя) явное указание шрифтов и прочее.
И мне кажется что автор не решил пункт (1) этой задачи. Этот пункт является обязательным на первых уроках информатики. Он называется "Системы счисления". Позиционные. Непозиционные. Перевод из одних систем в другие и прочее. Вот с этого надо начать обсуждение.
Каждый глиф имеет определенный код (code point/position) - номер ASCII (упрощенно), по которому можно получить его графическое представление в шрифте. Когда какой-то программе нужно отобразить текст на экране (text rendering), представляющий из себя последовательность из кодов глифов, она обращается к шрифту и просит у него выдать по очереди графическое представление каждого из них (превращение векторных контуров в растр). Затем выполняется отрисовка на некоторой области экрана системными средствам (glyph rendering API).
Wikipedia:
ASCII, Unicode, Font rasterization, FreeType
Я знаю, что глиф каждый глиф имеет определенный код. Я не понимаю, как система выбирает нужные глифы для вывода числа на экран, т.е. как система конвертирует двоичное число в коды символов, необходимых для отображения данного числа на экране.
Александр, программы/система не знают что такое двоичные числа. С точки зрения них есть только числа и их можно только сравнивать между собой. Программам пофигу где какое число, малое или большое, те просто хранятся в различных участках памяти и эти байты с числами программы гоняют по памяти туда-сюда. Двоичное представление чисел необходимо лишь для понимания как они выглядят в виде последовательности 0 и 1 (битов), поскольку информация хранится и передается на уровне электрических сигналов.
Я не понимаю, как система выбирает нужные глифы для вывода числа на экран
Программе нужно вывести что-то определенное на экран и эта последовательность символов и есть последовательность кодов глифов, изображения для которых поочередно просят у шрифта.
Роман Мирр, Я знаю, что такое биты. Но, очевидно, мой вопрос не очень понятен. Попробую привести пример.
Цифра "3" в ASCII имеет двоичный код 0011 0011;
Цифра "5" в ASCII имеет двоичный код 0011 0101;
Теперь предположим, что в памяти хранится число 0010 0011 (35 в десятичной системе). Это число нужно вывести на экран, представить пользователю в десятичной системе, т.е. использовать символы ASCII "3" и "5". Как компьютер понимает, что ему нужно использовать именно ЭТИ символы? Как он конвертирует двоичное число в коды символов ASCII (0010 0011 -> 0011 0011 0011 0101)?
Александр, надеюсь, что теперь понял вопрос корректно.
35 = 3*10^1 + 5*10^0 (2 знака в 10-чной системе счисления)
То есть в программе, у которой на входе число в десятичной системе, необходимо учесть логику разбиения числа на цифры в десятичной системе (от 0 до 9 максимум), то есть на выходе получим как раз эти 3, затем 5.
N = 35
35÷10 = 30 целое и 5 остаток
Кладем остаток 5 в стек (на дно кувшина), а целое (кратное 10) продолжаем обрабатывать
30÷10 = 3 целое и 0 остаток
0 - нечего класть в стек
Число 3 < 10, поэтому дальше нечего делить
и мы просто кладем его в стек поверх цифры 5.
Теперь за работу берется другое лицо, которое будет поочередно выкладывать из стека цифры. Эти цифры и есть последовательность, которую надо напечатать.
Зная, что эти знаки именно цифры, мы можем указать номера их позиций в таблице ASCII (Unicode является её расширением), а именно позиции с 48 (48+0) до 57 (48+9).
То есть, к каждой цифре добавляем число 48 и отдаем на хранение каждой в следующий байт.
Таким образом, при печати на экран поочередно берутся эти числа с кодами ASCII в диапазоне 48..57 и у шрифта запрашиваются их графические представления.
Роман Мирр, Вот оно как! Это мне и было интересно! Здесь задействуется определенный алгоритм, но я просто не мог понять какой. Об этом не так много пишут. Спасибо :)