2009-07-16 3 views
32

Я преподавал C моему младшему брату, изучающему инженерное дело. Я объяснял ему, как различные типы данных фактически хранятся в памяти. Я объяснил ему логистику за подписью/беззнаковым числом и битом с плавающей запятой в десятичных числах. Пока я рассказывал ему о типе char в C, я также брал его через систему кода ASCII, а также, как char также хранится как 1 байт.Есть ли какая-либо логика для заказа кодов ASCII?

Он спросил меня, почему «А» получил код ascii 65, а не что-нибудь еще? Аналогично, почему «а» задан код 97 конкретно? Почему существует пробел в 6 кодах ascii между диапазоном заглавных букв и маленькими буквами? Я понятия не имел об этом. Можете ли вы помочь мне понять это, так как это вызвало у меня большое любопытство. Я до сих пор не нашел ни одной книги, которая обсуждала эту тему.

В чем причина этого? Логически организованы коды ASCII?

+3

Хотя хорошо говорить о поплавках и десятичных знаках нетехническим образом, большинство поплавков в дикой природе - это двоичная с плавающей запятой, а не десятичная плавающая точка, что является источником большого путаницы для программистов , Это похоже на учение о том, что солнце вращается вокруг Земли - прекрасно, чтобы дети понимали день и ночь, но путают для начинающих ученых-ракетологов. –

+0

Связанные: [Все, что Хакер когда-то знал] (http://www.catb.org/esr/faqs/things-every-hacker-once-knew/) (о ASCII и связанных с ним технологиях) –

ответ

65

Есть исторические причины, в основном, чтобы сделать ASCII коды легко конвертировать:

Digits (0x30 до 0x39) имеет специальные бинарный префикс 110000:

0 is 110000 
1 is 110001 
2 is 110010 

и т.д. Так что, если вы уничтожите префикс (первые два «1»), вы заканчиваете цифрой в двоичном кодированном десятичном значении.

Заглавные буквы имеют двоичный префикс: 1000000

A is 1000001 
B is 1000010 
C is 1000011 

т.д. То же самое, если вы удалите префикс (первый «1»), вы в конечном итоге с алфавитом индексированных символов (A является 1 , Z - 26 и т. Д.).

строчные буквы имеют двоичный префикс 1100000:

a is 1100001 
b is 1100010 
c is 1100011 

и т.д. же, как описано выше. Итак, если вы добавите 32 (100000) в заглавную букву, у вас будет версия в нижнем регистре.

+2

Купить почему 'A' 65, а не 64. Любая кодировка имеет некоторую степень логики и некоторую степень произвола. –

+0

@JimBalter Поскольку они хотели, чтобы алфавит был проиндексирован 1. 1 - это A, 26 - Z. –

+0

@NathanLong Нет причин, чтобы хотеть этого и никаких доказательств того, что это правда. И 65 не 1. Вычитание 63 из письма приведет к 1-индексированию. –

0
  • «A» - 0x41 в шестнадцатеричном виде.
  • 'a' - 0x61 в hexidecimal.
  • '0' thru '9' - 0x30 - 0x39 в hexidecimal.

Так, по крайней мере, легко запомнить номера для A, a и 0-9. Я понятия не имею о символах. См. The Wikipedia article on ASCII Ordering.

6

Здесь очень подробная история и описание ASCII кодов: http://en.wikipedia.org/wiki/ASCII
Короче:

  • ASCII основан на стандартах кодирования телетайпа
  • первых 30 символов являются «непечатаемым» - используется для форматирования текста
  • затем они продолжаются с печатными символами, примерно так, чтобы они были размещены на клавиатуре. Проверьте клавиатуру:
    • пространство,
    • верхний регистр знак числа шапок!», #, ...,
    • номера
    • знаки, как правило, размещены в конце клавиатуры строки с номерами - верхний регистр
    • прописными буквами, по алфавиту
    • знаки, как правило, размещены в конце строк клавиатуры с буквами - верхний регистр
    • строчными буквами, по алфавиту
    • знаки, как правило, размещены в конце клавиатуры строки с буквами - строчными буквами
+0

Некоторые старые клавиатуры (я знаю Atari 800 был одним из них) имел «символ» на клавише «2», поэтому соответствие между кодировкой и порядком клавиатуры было ближе. – dan04

4

Расстояние между A и a равно 32. Это довольно круглое число, не так ли?

Разрыв 6 символов между заглавными буквами и малыми буквами состоит в том, что (32 - 26) = 6. (Примечание: в английском алфавите есть 26 букв).

+3

Английский алфавит имеет 26 символов, если вы делаете наивные предположения о заимствованных словах. –

+1

На самом деле это то же письмо как я, но с диакритической отметкой. И хотя английский заимствовал немало слов, я не думаю, что он заимствовал буквы, такие как þ (исландский) или IJ (голландский). – MSalters

0

Если вы посмотрите на двоичные представления для «a» и «A», вы увидите, что они отличаются только на 1 бит, что очень полезно (поворот верхнего регистра на нижний регистр или наоборот) вопрос перевертывания немного). Зачем начинать там конкретно, я понятия не имею.

10

Эта диаграмма показывает это довольно хорошо из википедии: обратите внимание на два столбца управления 2 верхнего 2 нижнего, а затем пробелы, заполненные разным разрядом. ASCII Chart on Wikipedia

Также следует иметь в виду, что ASCII был разработан на основе того, что прошло раньше. Более подробно об истории ASCII см. В разделе this superb article by Tom Jennings, который также включает в себя значение и использование некоторых символов управления незнакомыми людьми.

+0

Ссылка, кажется, сломана. –

0

Wikipedia:

Сам код был построен таким образом, что большинство управляющих кодов были вместе, и все графические коды были вместе. первые два столбца (32 позиции) были , зарезервированные для управляющих символов. [14] «Космический» персонаж должен был прийти перед графикой, чтобы сделать сортировку алгоритмов легко, поэтому она стала позицией 0x20. [15] Комитет решил, что важно поддерживать верхний регистр 64-символьный алфавит, и выбрал структуру ASCII, поэтому он может быть легко сведен к использованию 64-символьного набора графических кодов. [16] Нижний регистр буквы были поэтому не чередующимися с верхним регистром. Чтобы сохранить параметры открытой для строчных букв и других графиков, специальные и цифровые кодов были помещены перед буквами, и буквы «А» была помещен в позиция 0x41, чтобы соответствовать проекту соответствующим британскому стандарта . [17] Цифры 0-9 были расположены , поэтому они соответствуют значениям в двоичном формате с префиксом 011, что делает преобразование двоично-кодированным десятичным простым.