为什么十六进制数字前缀为 0x ?我理解前缀的用法,但我不明白选择 0x 的重要性 .
0x
Short story: 0 告诉解析器它正在处理一个常量(而不是标识符/保留字) . 仍需要一些东西来指定数字基数: x 是任意选择 .
0
x
Long story: 在60年代,流行的编程数字系统是十进制和八进制 - 大型机每字节有12,24或36位,可以很好地被3 = log2(8)整除 .
BCPL语言使用语法 8 1234 表示八进制数 . 当Ken Thompson从BCPL创建B时,他使用了 0 前缀 . 这很棒,因为
8 1234
一个整数常量现在总是由一个令牌组成,
解析器仍然可以立即告诉它有一个常数,
解析器可以立即告诉基数( 0 在两个基数中是相同的),
它在数学上是理智的( 00005 == 05 ),和
00005 == 05
不需要珍贵的特殊字符(如 #123 ) .
#123
当从B创建C时,需要十六进制数字(PDP-11具有16位字),并且上述所有点仍然有效 . 由于其他机器仍然需要octals, 0x 被任意选择( 00 可能被排除为尴尬) .
00
C#是C的后代,因此它继承了语法 .
注意:我不知道答案是否正确,但以下仅仅是我的个人猜测!
如前所述,数字前面的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!
它是一个前缀,表示该数字是十六进制而不是其他一些基数 . C编程语言使用它来告诉编译器 .
Example:
0x6400 转换为 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600. 当编译器读取 0x6400 时,它在 0x term的帮助下理解该数字是十六进制的 . 通常我们可以通过(6400)16或(6400)8等理解 .
0x6400
6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
对于 binary ,它将是:
0b00000001
希望我能以某种方式帮助过 .
Good day!
前面的0用于表示基数2,8或16中的数字 .
在我看来,选择0x表示十六进制,因为'x'听起来像十六进制 .
只是我的意见,但我认为这是有道理的 .
美好的一天!
4 回答
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的后代,因此它继承了语法 .
注意:我不知道答案是否正确,但以下仅仅是我的个人猜测!
如前所述,数字前面的0表示它是八进制的:
想象一下,需要提出一个系统来表示十六进制数字,并注意我们正在C风格的环境中工作 . 如何以汇编结束?不幸的是你不能 - 它会允许你制作有效标识符的标记(例如,你可以将变量命名为同一个东西),这会产生一些令人讨厌的含糊之处 .
出于同样的原因,你不能带领角色:
使用哈希可能被抛出,因为它与预处理器冲突:
最后,无论出于何种原因,他们决定在前导0后面加一个x来表示十六进制 . 它是明确的,因为它仍然以数字字符开头,因此不能是有效的标识符,并且可能基于前导0的八进制约定 .
它是一个前缀,表示该数字是十六进制而不是其他一些基数 . 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!
前面的0用于表示基数2,8或16中的数字 .
在我看来,选择0x表示十六进制,因为'x'听起来像十六进制 .
只是我的意见,但我认为这是有道理的 .
美好的一天!