为什么十六进制数字前缀为
0x
?
我理解前缀的用法,但不明白为什么选择 0x
的重要性。
短篇故事:
0
告诉解析器它正在处理一个常量(而不是标识符/保留字)。仍然需要一些东西来指定数基:x
是任意选择。
长话短说:在 60 年代,流行的编程数字系统是十进制和八进制 — 大型机每个字节有 12、18、24 或 36 位,可以很好地被 3 = log2(8) 整除。
BCPL 语言对八进制数使用语法
8 1234
。当 Ken Thompson 从 BCPL 创建 B 时,他使用了 0
前缀。这太棒了,因为
0
在两个基数中是相同的),00005 == 05
),并且#123
)。当从 B 创建 C 时,出现了对十六进制数的需求(PDP-11 有 16 位字和 8 位字节),并且上述所有要点仍然有效。由于其他机器仍然需要八进制,因此任意选择了
0x
(00
或0h
可能因尴尬而被排除)。
C# 是 C 的后代,因此它继承了语法。
您可以在 Dennis M. Ritchie 的页面找到有关 C 历史的详细信息。
注:我不知道正确答案,但以下只是我个人的猜测!
正如前面提到的,数字前加 0 表示它是八进制:
04524 // octal, leading 0
想象一下需要想出一个系统来表示十六进制数字,并注意我们正在 C 风格的环境中工作。以类似 h 的汇编结尾怎么样?不幸的是你不能 - 它允许你创建有效标识符的标记(例如,你可以将变量命名为相同的东西),这会造成一些令人讨厌的歧义。
8000h // hex
FF00h // oops - valid identifier! Hex or a variable or type named FF00h?
出于同样的原因,你不能用角色来领导:
xFF00 // also valid identifier
使用哈希可能会被丢弃,因为它与预处理器冲突:
#define ...
#FF00 // invalid preprocessor token?
最终,无论出于何种原因,他们决定在前导 0 后面放置一个 x 来表示十六进制。它是明确的,因为它仍然以数字字符开头,因此不能是有效的标识符,并且可能基于前导 0 的八进制约定。
0xFF00 // definitely not an identifier!
它是一个前缀,指示数字是十六进制而不是其他基数。编程语言用它来告诉编译器。
示例:
0x6400
翻译为 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
当编译器读取 0x6400
时,它会借助 0x 项理解该数字是十六进制。通常我们可以理解为 (6400)16 或 (6400)8 或其他..
对于 二进制 它将是:
0b00000001
美好的一天!
前面的 0 用于表示以 2、8 或 16 为基数的数字。
在我看来,选择 0x 来表示十六进制是因为“x”听起来像十六进制。
只是我的意见,但我觉得很有道理。
美好的一天!
我不知道
0x
作为表示十六进制数字的前缀背后的历史原因 - 因为它肯定可以采取多种形式。这种特殊的前缀样式来自计算机科学的早期。
由于我们习惯了十进制数字,因此通常不需要指示基数/基数。然而,出于编程目的,我们经常需要将基数与二进制 (base-2)、八进制 (base-8)、十进制 (base-10) 和十六进制 (base-16) 区分开来 - 作为最常用的数基数。
此时,这是用于表示数字基数的约定。我已经在上述所有基数中写出了数字 29 及其前缀:
0b11101
:二进制0o35
:八进制,用 o0d29
:十进制,这很不寻常,因为我们假设没有前缀的数字是十进制0x1D
:十六进制基本上,我们最常与基数相关联的字母表(例如 b 表示二进制)与
0
组合可以轻松区分数字的基数。
这特别有用,因为较小的数字可能会在所有基数中出现相同的混淆:0b1、0o1、0d1、0x1。
如果您使用的是富文本编辑器,您也可以使用下标来表示基数:12、18、110、116