0x
开头?
我了解前缀的用法,但我不明白为什么选择0x
。0x
开头?
我了解前缀的用法,但我不明白为什么选择0x
。简短故事: 在编程中,数字前的0
表示常量(不是标识符/保留字)。还需要指定数字进制:使用x
是任意选择。
长故事: 在六十年代,流行的编程数字系统是十进制和八进制——大型计算机每个字节有12、24或36位,这可以被3 = log2(8)很好地整除。
BCPL语言使用8 1234
语法来表示八进制数字。当Ken Thompson从BCPL创建出B语言时,他使用了0
前缀。这很好,因为
0
在两种基数中相同),00005 == 05
),并且#123
)。当C从B创建时,需要十六进制数字(PDP-11具有16位字)。所有上述点仍然有效。由于其他机器仍需要八进制,因此任意选择了0x
(可能排除了00
,因为它很尴尬)。
C#是C的后代,因此继承了该语法。
0x
相对于00
不是偏好或笨拙之举。00
会破坏现有的代码。八进制数0010
等于十进制的8
,而十六进制数0010
则等于16
。他们不能使用任何数字作为第二位指示符(除了8
或9
,但它们与十六进制没有任何相关意义),所以字母是必须的。这留下了要么是0h
要么是0x
(H e X十六进制)。从这一点上看,似乎真的回到了个人喜好的问题。 - GManNickG注意:我不知道正确答案,但以下仅是我的个人猜测!
如前所述,数字前的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?
最终,出于某种原因,他们决定在十六进制数前面加一个 0x。这是一种无歧义的表示方式,因为它仍然以数字字符开头,因此不能作为有效的标识符,这可能是基于八进制约定的延续。
0xFF00 // definitely not an identifier!
0xFFAB1234
必须写成0FFAB1234h
。我还记得我年轻时在Pascal的内联汇编中使用它。https://dev59.com/VGgt5IYBdhLWcg3w5xc_ - phuclv这是一个前缀,用于指示数字是十六进制而不是其他进制。编程语言使用它来告诉编译器。
例子:
0x6400
翻译成 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600.
当编译器读取 0x6400
时,它会在 0x 帮助下理解数字是十六进制的。通常我们可以通过 (6400)16 或 (6400)8 来理解 ..
对于二进制:
0b00000001
祝您好运!
在二进制、八进制或十六进制中,前置的0用于表示数字。
我个人认为,0x被选择用于表示十六进制是因为'x'听起来像十六进制。
这只是我的看法,但我认为这是有道理的。
祝好!
0x
的历史原因,因为它可能采用了许多形式。这种特定的前缀样式来自计算机科学的早期阶段。0b11101
:二进制0o35
:八进制,用o表示0d29
:十进制,这很不寻常,因为我们默认没有前缀的数字是十进制0x1D
:十六进制0
相结合,以轻松区分数字的基数。