为什么十六进制数字前缀为0x?

时间:2010-04-19 20:33:01

标签: c syntax hex

为什么十六进制数字前缀为0x?  我理解前缀的用法,但我不明白为什么选择0x的重要性。

5 个答案:

答案 0 :(得分:389)

短篇小说: 0告诉解析器它正在处理一个常量(而不是标识符/保留字)。仍然需要一些东西来指定数字基数:x是任意选择。

长篇故事:在60年代,流行的编程数字系统是十进制的和八进制 - 大型机每字节有12,24或36位,这很好地被整除3 = log2(8)。

BCPL语言对八进制数使用语法8 1234。当Ken Thompson从BCPL创建B时,他使用了0前缀。这很好,因为

  1. 整数常量现在总是由一个标记组成,
  2. 解析器仍然可以立即告诉它有一个常量,
  3. 解析器可以立即告诉基地(0在两个基地都是相同的),
  4. 它在数学上是理智的(00005 == 05)和
  5. 不需要珍贵的特殊字符(如#123)。
  6. 当从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