为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
开满天机 2019-08-15 14:00:49
为什么十六进制数字前缀为0x?为什么十六进制数字前缀为0x?我理解前缀的用法,但我不明白为什么0x选择的重要性。
查看完整描述

3 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

简单地说: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)。

当从B创建C时,需要十六进制数字(PDP-11具有16位字),并且上述所有点仍然有效。由于其他机器仍然需要octals,因此0x被任意选择(00可能被排除为尴尬)。

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


查看完整回答
反对 回复 2019-08-15
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

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

如前所述,数字前面的0表示它是八进制的:

04524 // octal, leading 0

想象一下,需要提出一个系统来表示十六进制数字,并注意我们正在C风格的环境中工作。如何以汇编结束?不幸的是你不能 - 它会允许你制作有效标识符的标记(例如,你可以将变量命名为同一个东西),这会产生一些令人讨厌的歧义。

8000h // hexFF00h // 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!


查看完整回答
反对 回复 2019-08-15
  • 3 回答
  • 0 关注
  • 2754 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信