首页 文章

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

提问于
浏览
365

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

4 回答

  • 90

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

    Long story: 在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的后代,因此它继承了语法 .

  • 383

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

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

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

    Example:

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

    对于 binary ,它将是:

    0b00000001

    希望我能以某种方式帮助过 .

    Good day!

  • 18

    前面的0用于表示基数2,8或16中的数字 .

    在我看来,选择0x表示十六进制,因为'x'听起来像十六进制 .

    只是我的意见,但我认为这是有道理的 .

    美好的一天!

相关问题