为什么十六进制数前缀是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是一个任意的选择。
长话短说:在60年代,流行的编程数字系统是十进制和八进制——大型机每字节有12,24或36位,这可以被3 = log2(8)整除。
BCPL语言使用语法8 1234表示八进制数。当Ken Thompson从BCPL创建B时,他使用了0前缀。这很棒,因为
一个整数常量现在总是由一个令牌组成, 解析器仍然可以马上看出它有一个常数, 解析器可以立即告诉base(在两个base中0是相同的), 它在数学上是合理的(00005 == 05),并且 不需要任何珍贵的特殊字符(如#123)。
当从B创建C时,对十六进制数的需求出现了(PDP-11有16位字),以上所有点仍然有效。由于其他机器仍然需要八进制,所以随机选择了0x(00可能被排除在外)。
c#是C的后代,所以它继承了C的语法。
它是一个前缀,表示数字是十六进制,而不是其他进制。编程语言用它来告诉编译器。
例子:
0x6400转换为6*16^3 + 4*16^2 +0*16^ 1 +0*16^0 = 25600。 当编译器读取0x6400时,它会在0x项的帮助下理解这个数字是十六进制的。通常我们可以理解为(6400)16或(6400)8或其他。
对于二进制,它将是:
0 b00000001
美好的一天!
前面的0表示以2、8或16为基数的数字。
在我看来,之所以选择0x来表示hex,是因为“x”听起来像hex。
这只是我的个人观点,但我认为这是有道理的。
美好的一天!
我不知道0x作为表示十六进制数的前缀背后的历史原因——因为它肯定可以有多种形式。这种特殊的前缀风格来自计算机科学的早期。
因为我们习惯了十进制数,所以通常不需要标明基数。然而,出于编程目的,我们经常需要将十进制与二进制(以2为基数)、八进制(以8为基数)、十进制(以10为基数)和十六进制(以16为基数)区分开来——这是最常用的数进制。
在这个时间点上,它是用来表示一个数的底数的一种惯例。我把数字29写在上面所有的底数和前缀中:
0 b11101:二进制 0o35:八进制,用o表示 0d29:十进制,这是不寻常的,因为我们假设没有前缀的数字是十进制的 0 x1d:十六进制
基本上,我们最常与进位数联系在一起的字母(例如,b代表二进制)与0结合,可以很容易地区分数字的进位数。
这是特别有用的,因为较小的数字在所有底数中都可能出现相同的情况:0b1, 0o1, 0d1, 0x1。
如果你使用的是富文本编辑器,你也可以使用下标来表示进制:12,18,110,116
推荐文章
- 为什么函数指针定义可以使用任意数量的&号或星号* ?
- JavaScript错误(Uncaught SyntaxError:意外的输入结束)
- 在Bash中测试非零长度字符串:[-n "$var"]或["$var"]
- 什么是可重入函数?
- 如何在C中将数组初始化为0 ?
- Typedef定长数组
- 在C语言中通过引用传递
- sizeof(某个指针)总是等于4吗?
- 为什么星号在变量名之前,而不是在类型之后?
- 何时使用内联函数,何时不使用它?
- 在C语言中如何比较结构是否相等?
- 在套接字编程中AF_INET和PF_INET的区别是什么?
- #在C中定义打印调试宏?
- Shell脚本for循环语法
- read()和recv(), send()和write()之间有什么区别?