为什么十六进制数字以前缀0x
?我了解前缀的用法,但不了解0x
选择为什么的意义。
为什么十六进制数字以前缀0x
?我了解前缀的用法,但不了解0x
选择为什么的意义。
Answers:
简单地说:在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位字),并且以上所有点仍然有效。由于其他机器仍需要八进制数,0x
因此可以任意选择八进制数(00
可能被排除在尴尬之外)。
C#是C的后代,因此它继承了语法。
0x
在00
为偏好/尴尬。00
会破坏现有代码。0010
如八进制一样8
,而0010
如十六进制一样16
。他们不能使用任何数字作为第二位数字指示符(8
或除外9
,也不具有与十六进制有关的任何意义),因此必须输入字母。剩下的就是0h
或0x
(H e X十进制)。从这一点来看,似乎真的回到了偏好。
0
多年来,为八进制使用前缀已经引起了很多问题。尤其是在像英国这样的国家中,电话号码以开头0
。Javascript和许多其他语言会将它们解析为八进制,在存储之前先处理数字。为了助兴,一个流行的数据库产品将悄无声息,如果数字包含在切换回十进制解析8
或9
。
注意:我不知道正确的答案,但以下只是我个人的猜测!
如前所述,数字前的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?
最后,无论出于何种原因,他们决定将x放在前导0后面以表示十六进制。它是明确的,因为它仍以数字字符开头,因此不能成为有效的标识符,并且可能基于前导0的八进制约定。
0xFF00 // definitely not an identifier!
0xFFAB1234
必须写为0FFAB1234h
。我还记得我年轻时在Pascal的嵌入式asm中获得的代码stackoverflow.com/q/11733731/995714
它是一个前缀,表示数字以十六进制表示,而不是以其他基数表示。C编程语言使用它来告诉编译器。
例:
0x6400
转换为 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
编译器读取时0x6400
,它借助0x 术语了解数字为十六进制。通常我们可以通过(6400)16或(6400)8来理解或其他任何东西。
对于二进制文件,它将是:
0b00000001
希望我有所帮助。
美好的一天!
x6400
?将x
仍然可以用来推断十六进制。
前面的0表示以2、8或16为基数的数字。
在我看来,选择0x表示十六进制是因为'x'听起来像十六进制。
只是我的意见,但我认为这是有道理的。
美好的一天!