计算机如何区分二进制中的字母和数字?

How do computers differentiate between letters and numbers in binary?

我只是好奇,因为 65 与字母 A 相同

如果这是错误的堆栈抱歉。

简答。他们没有。更长的答案,00000000 和 11111111 之间的每个二进制组合在 ASCII 字符集中都有一个字符表示。 01000001 恰好是 30 多年前指定的拉丁字母表中的第一个大写字母。还有其他字符集和代码页,它们代表不同的字母、数字、不可打印和带重音符号的字母。二进制 01000001 完全有可能是一个小写的 z,在不同的字符集中顶部有波浪线。 'computers' 不知道(或不关心)特定的二进制表示对人类意味着什么。

“65与字母A相同”:你说的对。但是不多说也没什么用。

没有文字,只有经过编码的文字。没有数字,只有编码的数字。对于 CPU,一些数字编码是原生的,其他一切都只是未区分的数据。

(有些数据只是程序的数据,其他数据是程序的CPU指令。如果CPU不恰当地将数据作为指令执行,这是一个安全问题。一些架构保留程序数据和说明分开。)

常见的本机数字编码是 1、2、4 和 8 字节的有符号和无符号整数以及 IEEE-754 单精度和双精度浮点数。有符号整数通常是两个's-complement。 Multi-byte 整数具有字节顺序(或字节顺序),因为在典型的机器上每个字节都是可单独寻址的。如果数字编码不是原生的,则需要程序库来处理此类数据。

文本是字符集中的一系列编码字符。有数百个字符集。字符集是将概念字符分配给称为代码点的数字。有时概念字符是categorized as lowercase letter, digit, symbol, etc. A codepoint value is mapped to bytes using a character encoding. Most character sets have one encoding, but Unicode有几个。一些字符集是其他字符集的子集——这种关系通常没有用,因为在任何一种上下文中都只使用一个字符集。

程序是一组对数据进行操作的指令。它必须对正确的数据应用正确的操作。因此,区分文本和数字的是程序,通常是通过其位置或流路径。

存储的数据必须采用已知的编码文本和数字布局。有时布局也被存储。布局称为元数据。 如果没有数据附带的元数据或没有达成一致,则无法使用数据。

通过适当的簿记,这一切都非常简单。但是有多种簿记方法,因此对于如何处理没有元数据的数据没有通用的解决方案。方法包括:Well-known and/or 注册文件扩展名、HTTP headers、MIME 类型、HTML 元字符集标记、XML 编码声明。某些方法仅在特定上下文中有效,例如具有 four-character 代码 (FourCC) 的 audio/video 编解码器和具有 shebang 的 unix shell 脚本。有些方法只能帮助缩小猜测范围,例如文件签名。不用说,应该避免猜测;它会导致安全问题和数据丢失。

不幸的是,文本文件通常没有元数据。就元数据达成一致或单独传达尤为重要。

没有元数据的数据是 "binary"。所以文本的作者必须同意 reader 使用哪种字符编码。同样,对于所有类型的数据。这里reader和writer既是人又是程序。