为什么十六进制数前缀为0x? 我理解前缀的用法,但我不明白为什么选择0x的意义
0x
注:我不知道正确答案,以下只是我个人的猜测!
如前所述,数字前面的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?
最后,不管出于什么原因,他们决定在前导0后面加一个x来表示十六进制。它是明确的,因为它仍然以数字字符开始,所以不能是一个有效的标识符,并且可能是基于八进制的前导0的约定。
0xFF00 // definitely not an identifier!
0告诉解析器它正在处理一个常量(而不是一个标识符/保留字)。仍然需要一些东西来指定基数:x是一个任意的选择。
0
x
在60年代,流行的编程数字系统是十进制的,而八进制 -大型机每字节有12,24或36位,这可以被3 = log2(8)整除。
BCPL语言使用语法8 1234表示八进制数。当Ken Thompson从BCPL创建B时,他使用了0前缀。这很棒,因为
8 1234
00005 == 05
#123
当从B创建C时,对十六进制数的需求出现了(PDP-11有16位字),以上所有点仍然有效。由于其他机器仍然需要八进制,所以0x被任意选择(00可能被排除在外)。
00
c#是C的后代,所以它继承了C的语法。
它是一个前缀,表示数字是十六进制,而不是其他进制。编程语言用它来告诉编译器。
例子:
0x6400转换为6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600. 当编译器读取0x6400时,它会在0 x项的帮助下理解这个数字是十六进制的。通常我们可以理解为(6400)16或(6400)8或其他..
0x6400
6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
对于< >强二进制< / >强,它将是:
0b00000001
美好的一天!
前面的0表示以2、8或16为基数的数字。
在我看来,之所以选择0x来表示hex,是因为“x”听起来像hex。
这只是我的个人观点,但我认为这是有道理的。
我不知道0x作为表示十六进制数的前缀背后的历史原因——因为它肯定可以有多种形式。这种特殊的前缀风格来自计算机科学的早期。
由于我们习惯使用十进制数,通常不需要指明基地/基数。然而,出于编程目的,我们经常需要将十进制与二进制(以2为基数)、八进制(以8为基数)、十进制(以10为基数)和十六进制(以16为基数)区分开来——这是最常用的数进制。
在这个时间点上,它是用来表示一个数的底数的一种惯例。我把数字29写在上面所有的底数和前缀中:
0b11101
0o35
0d29
0x1D
基本上,我们最常与进位数联系在一起的字母表(例如,b表示二进制)与0结合在一起,可以轻松区分数字的进位数。
这是特别有用的,因为较小的数字在所有底数中都可能出现相同的情况:0b1, 0o1, 0d1, 0x1。
如果你使用的是富文本编辑器,你也可以使用下标来表示碱基:12, 18, 110, 116