为什么十六进制数字前缀为0x
?
我理解前缀的用法,但我不明白为什么选择0x
的重要性。
答案 0 :(得分:389)
短篇小说: 0
告诉解析器它正在处理一个常量(而不是标识符/保留字)。仍然需要一些东西来指定数字基数:x
是任意选择。
长篇故事:在60年代,流行的编程数字系统是十进制的和八进制 - 大型机每字节有12,24或36位,这很好地被整除3 = log2(8)。
BCPL语言对八进制数使用语法8 1234
。当Ken Thompson从BCPL创建B时,他使用了0
前缀。这很好,因为
0
在两个基地都是相同的),00005 == 05
)和#123
)。当从B创建C时,出现了对十六进制数的需求(PDP-11具有16位字),并且上述所有点仍然有效。由于其他机器仍然需要octals,因此0x
被任意选择(00
可能被排除为尴尬)。
C#是C的后代,因此它继承了语法。
答案 1 :(得分:91)
注意:我不知道正确的答案,但以下只是我的个人推测!
如前所述,在数字之前的0表示它是八进制:
04524 // octal, leading 0
想象一下,需要提出一个系统来表示十六进制数字,并注意我们正在C风格的环境中工作。如何以汇编结束?不幸的是你不能 - 它会允许你制作有效标识符的标记(例如,你可以将变量命名为同一个标记),这会产生一些令人讨厌的歧义。
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!
答案 2 :(得分:20)
它是一个前缀,表示该数字是十六进制而不是其他一些基数。 C编程语言使用它来告诉编译器。
示例:强>
0x6400
转换为6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
当编译器读取0x6400
时,它在 0x 项的帮助下理解该数字是十六进制的。通常我们可以通过(6400) 16 或(6400) 8 或其他来理解..
对于 二进制 ,它将是:
0b00000001
希望我能以某种方式提供帮助。
美好的一天!
答案 3 :(得分:7)
前面的0用于表示基数为2,8或16的数字。
在我看来,选择0x表示十六进制,因为' x'听起来像十六进制。
我的意见,但我认为这是有道理的。
美好的一天!
答案 4 :(得分:0)
我不知道 0x
作为前缀来表示十六进制数字背后的历史原因 - 因为它当然可以采用多种形式。这种特殊的前缀样式来自计算机科学的早期。
由于我们习惯于使用十进制数,因此通常不需要指明基数/基数。但是,出于编程目的,我们经常需要将基数与二进制 (base-2)、八进制 (base-8)、十进制 (base-10) 和十六进制 (base-16) 区分开来——作为最常用的数字基数。< /p>
此时它是用于表示数字基数的约定。我在上面所有的基数中都用它们的前缀写了数字 29:
0b11101
:二进制0o35
:八进制,用 o 表示0d29
:十进制,这是不常见的,因为我们假设没有前缀的数字是十进制0x1D
:十六进制基本上,我们最常将一个字母与基数联系起来(例如 b 表示二进制)与 0
结合以轻松区分数字的基数。
这特别有用,因为较小的数字可能会令人困惑地在所有基数中显示相同:0b1、0o1、0d1、0x1。
如果您使用的是富文本编辑器,您也可以使用下标来表示碱基:12、18、110, 116