Низкоуровневая детализация представления char на компьютере

Я читал, что в C char на самом деле является целым числом, потому что символы представлены в виде шаблонов битов.

Поэтому мне интересно, когда вы запускаете свою программу, как операционная система узнает, когда печатать шаблон битов как число или символ. Какой код определяет, что должно быть напечатано?

А где находится таблица ASCII и как происходит преобразование?


person Apeee    schedule 02.10.2012    source источник
comment
В Википедии есть таблица ASCII...   -  person Kerrek SB    schedule 02.10.2012
comment
Я думаю, вы путаетесь между C, который является абстрактным языком программирования, и аппаратным обеспечением, представляющим собой дорогой металл, который плавится, если его не охладить. Первый используется для программирования второго, но это не означает, что C буквально описывает процессор.   -  person Kerrek SB    schedule 02.10.2012
comment
Да, я могу запутаться. но я знаю, что это разные вещи.   -  person Apeee    schedule 02.10.2012
comment
Я имел в виду, где в ОС находится таблица ASCII? тот, который ОС использует для преобразования   -  person Apeee    schedule 02.10.2012
comment
Если вы узнаете о системах типов и о том, для чего они нужны, это может быть познавательно.   -  person Kerrek SB    schedule 02.10.2012
comment
Для компьютера все является числом. Что означает это число, определяется (почти исключительно в наши дни) программным обеспечением. В C символ представляет собой 1-байтовое число со знаком. Как вы используете этот номер (например, printf("%c", chr)) зависит от вас. Примечание: C определяет sizeof(char)==1, который обычно равен 8 битам, но не обязательно.   -  person Brian White    schedule 04.10.2012


Ответы (4)


Как операционная система узнает, когда печатать шаблон битов в виде числа или символа.

Это не так. Вы явно указываете компилятору, следует ли обрабатывать его как символ или целое число, указав правильный дескриптор формата на printf. И именно по этой причине несоответствие между дескриптором формата и типом фактического аргумента приводит к неопределенному поведению.

person Alok Save    schedule 02.10.2012
comment
Если вам интересно узнать, чем отличается C++ при использовании cout, компилятор ищет перегрузку оператора << ostream, который делает разные вещи в зависимости от типа ввода. - person Wug; 02.10.2012
comment
Хорошо, но какая часть операционной системы на самом деле печатает? - person Apeee; 02.10.2012
comment
Зависит от операционной системы. Некоторые ОС имеют специальные библиотеки для вывода текста на экран. Дополнительную информацию можно найти на странице en.wikipedia.org/wiki/Computer_terminals. - person dyoo; 02.10.2012
comment
@Als, что происходит, когда программа запрашивает у пользователя ввод, как тогда она различает? все еще с дескриптором формата? - person Apeee; 02.10.2012
comment
@Apeee: Да.scanf() работает на основе дескрипторов формата. - person Alok Save; 02.10.2012
comment
@Als Итак, во время выполнения он должен резервировать память для ввода и в нем указывать, что он запрашивает? (целое/символ) - person Apeee; 02.10.2012
comment
@Apeee: scanf - тупая функция. Она не понимает требований к памяти, как читать и т. д. Вам нужно научить ее правильно читать данные. scanf не резервирует память, он просто считывает содержимое по адресу, который вы передаете ему в качестве параметров. Вы несете ответственность за то, чтобы передача адреса была действительной, а выделенной памяти было достаточно для хранения прочитанных данных. И то, как обрабатывать прочитанные данные, определяется указанным вами дескриптором формата. - person Alok Save; 03.10.2012

Это зависит от того, как вы говорите своей программе интерпретировать биты в вашем коде. Например,

printf("%d %c", 'a', 97);

Это напечатает: 97 a

person P.P    schedule 02.10.2012
comment
Я понимаю, но есть ли часть ОС, которая на самом деле печатает символ/число? или дело в железе? - person Apeee; 02.10.2012
comment
@Apeee Это может быть одно или оба. Текстовые режимы дисплеев CGA/EGA/(S)VGA работают с кодами ASCII, а символы визуализируются с использованием аппаратных или программируемых шрифтов (в основном изображения символов). В графических режимах обычно задачей ОС является отрисовка символов с использованием одного и того же шрифта. - person Alexey Frunze; 02.10.2012
comment
Спасибо, Алекс, это часть того, что я хотел понять, но не нашел слов, чтобы описать это. - person Apeee; 02.10.2012

Если вы используете Linux-машину, просто введите man ascii в терминал, и вы увидите все значения char (в десятичном, восьмеричном и шестнадцатеричном формате). Если нет, просто погуглите таблицу ascii, и, вероятно, все будет готово.

person Simon MILHAU    schedule 02.10.2012
comment
Аккуратно, не знал, что в Linux есть встроенная таблица ASCII - person Mike; 02.10.2012
comment
Я не использую его. Но для этого в интернете есть множество таблиц. - person Apeee; 02.10.2012

... символы представлены в виде шаблонов битов.

На компьютере все представлено в виде набора битов: символы, целые числа, действительные числа и исполняемый код. Восемь битов 01000001 могут представлять целое число 65 (хотя целые числа обычно занимают не менее 16 бит) или букву A в системе ASCII. Существуют сложные способы отслеживания того, что есть что, это одна из основных обязанностей операционной системы и языков программирования высокого уровня. printf — это один из тех редких случаев, когда программист должен явно сказать функции, какие данные передаются.

Я читал, что в C char на самом деле является целым числом, потому что символы представлены в виде шаблонов битов.

Это не совсем так: в C символы и целые числа были разными типами в течение очень долгого времени. C позволяет вам использовать char как int, если вы хотите, по выбору разработчиков языка: битовый шаблон в основном используется как соответствующий int. C не позволит вам использовать float как int, так как битовая комбинация не даст вам ничего полезного (битовая комбинация для 1.0 совсем не похожа на битовую комбинацию для целого числа 1).

Что касается таблицы ASCII, она воплощена в конструкции аппаратного и программного обеспечения, отображающего текст, и в функциях языка программирования, управляющих им. Компьютерный шрифт представляет собой преобразование чисел в формы. или «глифы». В простейшем случае он сопоставляет числа в диапазоне ASCII (32–126) с соответствующим глифом. (На самом деле это часто более косвенный путь к тому же результату). В старых компьютерных терминалах глифы были встроены, а в приложениях Windows или X11 используются программные шрифты.

Что касается языков программирования, то функция вроде isdigit() или isalpha() просто ищет код символа в таблице своих свойств: isdigit() возвращает true для чисел 48-57 (которые кодируют цифры ASCII) и false для всех остальных. Никаких глифов не задействовано.

person alexis    schedule 04.10.2012