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

为什么十六进制数前缀为0x? 我理解前缀的用法,但我不明白为什么选择0x的意义

352499 次浏览

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

如前所述,数字前面的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!

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

在60年代,流行的编程数字系统是十进制的,而八进制 -大型机每字节有12,24或36位,这可以被3 = log2(8)整除。

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

  1. 一个整数常量现在总是由一个令牌组成,
  2. 解析器仍然可以马上看出它有一个常数,
  3. 解析器可以立即告诉base (0在两个base中是相同的),
  4. 它在数学上是理智的(00005 == 05),并且
  5. 不需要珍贵的特殊字符(如#123)。

当从B创建C时,对十六进制数的需求出现了(PDP-11有16位字),以上所有点仍然有效。由于其他机器仍然需要八进制,所以0x被任意选择(00可能被排除在外)。

c#是C的后代,所以它继承了C的语法。

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

例子:

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

对于< >强二进制< / >强,它将是:

0b00000001

美好的一天!

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

在我看来,之所以选择0x来表示hex,是因为“x”听起来像hex。

这只是我的个人观点,但我认为这是有道理的。

美好的一天!

我不知道0x作为表示十六进制数的前缀背后的历史原因——因为它肯定可以有多种形式。这种特殊的前缀风格来自计算机科学的早期。

由于我们习惯使用十进制数,通常不需要指明基地/基数。然而,出于编程目的,我们经常需要将十进制与二进制(以2为基数)、八进制(以8为基数)、十进制(以10为基数)和十六进制(以16为基数)区分开来——这是最常用的数进制。

在这个时间点上,它是用来表示一个数的底数的一种惯例。我把数字29写在上面所有的底数和前缀中:

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

基本上,我们最常与进位数联系在一起的字母表(例如,b表示二进制)与0结合在一起,可以轻松区分数字的进位数。

这是特别有用的,因为较小的数字在所有底数中都可能出现相同的情况:0b1, 0o1, 0d1, 0x1。

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