46

我正在给学习工程学的弟弟教 C。我在向他解释不同的数据类型是如何实际存储在内存中的。我向他解释了有符号/无符号数字和十进制浮点位背后的逻辑。当我告诉他 C 中的 char 类型时,我还带他了解了 ASCII 代码系统以及 char 如何也存储为 1 字节数。

他问我为什么“A”被赋予了 ASCII 码 65 而没有其他任何东西?同样,为什么“a”被​​指定为代码 97?为什么大写字母和小写字母的范围之间有6个ASCII码的差距?我对此一无所知。你能帮我理解一下吗,因为这也让我产生了极大的好奇心。到目前为止,我从未找到任何讨论过这个话题的书。

这背后的原因是什么?ASCII 代码是否有逻辑组织?

4

7 回答 7

73

有历史原因,主要是为了让ASCII码容易转换:

数字(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) 添加到大写字母,则您将获得小写版本。

于 2009-07-16T08:30:38.963 回答
11

这张图表从维基百科中很好地显示了它:注意控制 2 的上部 2 和下部的两列,然后用 misc 填充间隙。 维基百科上的 ASCII 图表

还要记住,ASCII 是根据之前的内容开发的。有关 ASCII 历史的更多详细信息,请参阅Tom Jennings 的这篇精彩文章,其中还包括一些陌生控制字符的含义和用法。

于 2009-07-16T08:29:53.160 回答
6

以下是 ASCII 码的非常详细的历史和描述:http
://en.wikipedia.org/wiki/ASCII 简而言之:

  • ASCII 基于电传打印机编码标准
  • 前 30 个字符是“不可打印的” - 用于文本格式
  • 然后他们继续使用可打印的字符,大致按照它们被放置在键盘上的顺序。检查你的键盘:
    • 空间,
    • 数字大写上的大写符号:!, ", #, ...,
    • 数字
    • 符号通常放置在带有数字的键盘行的末尾 - 大写
    • 大写字母,按字母顺序
    • 标志通常放置在带有字母的键盘行的末尾 - 大写
    • 小写字母,按字母顺序
    • 标志通常放置在带有字母的键盘行的末尾 - 小写
于 2009-07-16T08:27:40.873 回答
5

A和之间的距离a是 32。这是一个相当整数,不是吗?

大写字母和小写字母之间有6个字符的差距是因为(32 - 26) = 6。(注:英文字母有26个字母)。

于 2009-07-16T08:28:10.247 回答
0
  • 'A' 是十六进制的 0x41。
  • 'a' 是十六进制的 0x61。
  • '0' 到 '9' 是十六进制的 0x30 - 0x39。

所以至少很容易记住 和的A数字。我对符号一无所知。请参阅有关 ASCII 排序的 Wikipedia 文章a0-9

于 2009-07-16T08:25:07.307 回答
0

如果您查看“a”和“A”的二进制表示,您会发现它们仅相差 1 位,这非常有用(将大写字母转换为小写字母或反之亦然只是翻转 a少量)。为什么要专门从那里开始,我不知道。

于 2009-07-16T08:28:54.287 回答
0

维基百科

代码本身的结构使得大多数控制代码都在一起,所有图形代码都在一起。前两列(32 个位置)保留用于控制字符。[14] “空格”字符必须出现在图形之前以简化排序算法,因此它变成了位置 0x20。[15] 委员会认为支持大写 64 个字符的字母很重要,并选择构建 ASCII 以便可以轻松地将其简化为可用的 64 个字符的图形代码集。 [16] 因此,小写字母不与大写字母交错。为了使小写字母和其他图形的选项保持开放,特殊和数字代码放置在字母之前,字母“A”放置在位置 0x41 以匹配相应英国标准的草案。

于 2009-07-16T08:37:42.723 回答