为什么十六进制数要加上0x前缀?

问题描述 投票:0回答:5

为什么十六进制数字前缀为

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

c syntax hex
5个回答
573
投票

短篇故事:

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

长话短说:在 60 年代,流行的编程数字系统是十进制和八进制 — 大型机每个字节有 12、18、24 或 36 位,可以很好地被 3 = log2(8) 整除。

BCPL 语言对八进制数使用语法

8 1234
。当 Ken Thompson 从 BCPL 创建 B 时,他使用了
0
前缀。这太棒了,因为

  1. 整数常量现在始终由单个标记组成,
  2. 解析器仍然可以立即知道它有一个常量,
  3. 解析器可以立即告诉基数(
    0
    在两个基数中是相同的),
  4. 它在数学上是合理的(
    00005 == 05
    ),并且
  5. 不需要珍贵的特殊字符(如
    #123
    )。

当从 B 创建 C 时,出现了对十六进制数的需求(PDP-11 有 16 位字和 8 位字节),并且上述所有要点仍然有效。由于其他机器仍然需要八进制,因此任意选择了

0x
00
0h
可能因尴尬而被排除)。

C# 是 C 的后代,因此它继承了语法。

您可以在 Dennis M. Ritchie 的页面找到有关 C 历史的详细信息。


119
投票

注:我不知道正确答案,但以下只是我个人的猜测!

正如前面提到的,数字前加 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!

41
投票

它是一个前缀,指示数字是十六进制而不是其他基数。编程语言用它来告诉编译器。

示例:

0x6400
翻译为
6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
当编译器读取
0x6400
时,它会借助 0x 项理解该数字是十六进制。通常我们可以理解为 (6400)16 或 (6400)8 或其他..

对于 二进制 它将是:

0b00000001

美好的一天!


20
投票

前面的 0 用于表示以 2、8 或 16 为基数的数字。

在我看来,选择 0x 来表示十六进制是因为“x”听起来像十六进制。

只是我的意见,但我觉得很有道理。

美好的一天!


14
投票

我不知道

0x
作为表示十六进制数字的前缀背后的历史原因 - 因为它肯定可以采取多种形式。这种特殊的前缀样式来自计算机科学的早期。

由于我们习惯了十进制数字,因此通常不需要指示基数/基数。然而,出于编程目的,我们经常需要将基数与二进制 (base-2)、八进制 (base-8)、十进制 (base-10) 和十六进制 (base-16) 区分开来 - 作为最常用的数基数。

此时,这是用于表示数字基数的约定。我已经在上述所有基数中写出了数字 29 及其前缀:

  • 0b11101
    :二进制
  • 0o35
    :八进制,用 o
  • 表示
  • 0d29
    :十进制,这很不寻常,因为我们假设没有前缀的数字是十进制
  • 0x1D
    :十六进制

基本上,我们最常与基数相关联的字母表(例如 b 表示二进制)与

0
组合可以轻松区分数字的基数。

这特别有用,因为较小的数字可能会在所有基数中出现相同的混淆:0b1、0o1、0d1、0x1。

如果您使用的是富文本编辑器,您也可以使用下标来表示基数:12、18、110、116

© www.soinside.com 2019 - 2024. All rights reserved.