Řrř*_*ola 411
简单地说:在0
告诉它在处理一个恒定的(而不是一个标识符/保留字)的解析器.仍然需要一些东西来指定数字基数:这x
是一个任意的选择.
长篇:在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的后代,因此它继承了语法.
Ash*_*ain 93
注意:我不知道答案是否正确,但以下仅仅是我的个人猜测!
如前所述,数字前面的0表示它是八进制的:
04524 // octal, leading 0
Run Code Online (Sandbox Code Playgroud)
想象一下,需要提出一个系统来表示十六进制数字,并注意我们正在C风格的环境中工作.如何以汇编结束?不幸的是你不能 - 它会允许你制作有效标识符的标记(例如,你可以将变量命名为同一个东西),这会产生一些令人讨厌的含糊之处.
8000h // hex
FF00h // oops - valid identifier! Hex or a variable or type named FF00h?
Run Code Online (Sandbox Code Playgroud)
出于同样的原因,你不能带领角色:
xFF00 // also valid identifier
Run Code Online (Sandbox Code Playgroud)
使用哈希可能会被抛出,因为它与预处理器冲突:
#define ...
#FF00 // invalid preprocessor token?
Run Code Online (Sandbox Code Playgroud)
最后,无论出于何种原因,他们决定在前导0后面加一个x来表示十六进制.它是明确的,因为它仍然以数字字符开头,因此不能是有效的标识符,并且可能基于前导0的八进制约定.
0xFF00 // definitely not an identifier!
Run Code Online (Sandbox Code Playgroud)
loy*_*ola 24
它是一个前缀,表示该数字是十六进制而不是其他一些基数.C编程语言使用它来告诉编译器.
例:
0x6400
转换为 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
当编译器读取时0x6400
,它在0x term 的帮助下理解数字是十六进制的.通常我们可以通过(6400)16或(6400)8等理解.
对于二进制文件,它将是:
0b00000001
希望我能以某种方式帮助过.
美好的一天!
Adv*_*kar 14
我不知道0x
作为表示十六进制数字的前缀背后的历史原因 - 因为它肯定可以采取多种形式。这种特殊的前缀样式来自计算机科学的早期。
由于我们习惯于十进制数字,因此通常不需要指示基数/基数。然而,出于编程目的,我们经常需要将基数与二进制 (base-2)、八进制 (base-8)、十进制 (base-10) 和十六进制 (base-16) 区分开来,这些是最常用的基数。
目前,它是用于表示数字基数的约定。我已经用上述所有基数及其前缀写出了数字 29:
0b11101
:二进制0o35
:八进制,用 o 表示0d29
:十进制,这很不寻常,因为我们假设没有前缀的数字是十进制0x1D
: 十六进制基本上,我们最常将字母表与基数(例如 b 表示二进制)结合起来,0
以便轻松区分数字的基数。
这特别有用,因为较小的数字可能会在所有基数中出现相同的混淆:0b1、0o1、0d1、0x1。
如果您使用的是富文本编辑器,您也可以使用下标来表示基数: 1 2 , 1 8 , 1 10 , 1 16
小智 10
前面的0用于表示基数2,8或16中的数字.
在我看来,选择0x表示十六进制,因为'x'听起来像十六进制.
只是我的意见,但我认为这是有道理的.
美好的一天!