在这段时间之后,我从未想过要问这个问题;我知道这来自c ++,但背后的原因是什么:
为什么是0?为什么是0x?基础-32是否存在自然进展?
答案 0 :(得分:16)
Octal不能很好地映射到8位字节,因为每个八进制数字代表三位,因此总是会有八位符号表示的多余位。一个全TRUE位的字节(1111 1111)是八进制的377,但是十六进制的FF。
对于大多数人来说,十六进制更易于在二进制中转换为二进制数,因为二进制数通常以八个为单位表示(因为这是一个字节的大小),八个正好是两个十六进制数字,但十六进制表示法会丹尼斯的时间里一直很笨拙和误导(暗示能够解决16位)。程序员在使用硬件时(每个位通常代表物理线路)和使用逐位逻辑(每个位具有程序员定义的含义)时需要考虑二进制。
我想丹尼斯在每日十进制数字上添加了0前缀作为最简单的变量,对于那些早期解析器来说最容易区分。
我相信十六进制符号0x__稍后会添加到C中。编译器解析树以区分1-9(十进制常量的第一个数字),0(八进制常量的第一个[无效]数字)和0x(表示后续数字中的十六进制常量)相互之间的相当多比使用前导0作为指示符从解析后续数字切换为八进制而不是十进制更复杂。
丹尼斯为什么这样设计? Contemporary programmers并不理解这些早期的计算机通常是通过在CPU前面板或打孔卡或纸带上物理翻转开关来向CPU切换指令来控制的;保存一些步骤或指令的所有环境都代表了大量手工劳动的节省。此外,内存有限且价格昂贵,因此即使保存一些指令也具有很高的价值。
总结: 0表示八进制,因为它是高效可解析的,而且八进制在PDP-8上是用户友好的(至少对于地址操作)
0x for hex可能是因为它是八进制前缀标准的自然向后兼容扩展,并且仍然相对有效地解析。
答案 1 :(得分:7)
八进制的零前缀和十六进制的0x来自Unix的早期。
八进制存在的原因可以追溯到有6位字节的硬件,这使得八进制成为自然选择。每个八进制数字代表3位,因此6位字节是两个八进制数字。十六进制也是如此,从8位字节开始,其中十六进制数字是4位,因此一个字节是两个十六进制数字。对八位字节使用八进制需要3个八进制数字,其中第一个只能有值0,1,2和3(第一个数字实际上是'tetral',而不是八进制)。 除非有人开发出一个字节长度为十位的系统,否则没有理由去base32,因此十位字节可以表示为两个5位“nybbles”。
答案 2 :(得分:5)
“新”数字必须以数字开头,以使用现有语法。
已建立的实践具有变量名称和以字母开头的其他标识符(或一些其他符号,可能是下划线或美元符号)。所以“a”,“abc”和“a04”都是名字。数字以数字开头。所以“3”和“3e5”是数字。
当您向编程语言添加新内容时,您会尝试使它们适合现有的语法,语法和语义,并尝试使现有代码继续工作。因此,您不希望更改语法以使“x34”成为十六进制数或“o34”成为八进制数。
那么,你如何在这个语法中加入八进制数字?有人意识到,除“0”外,不需要以“0”开头的数字。没有人需要为123写“0123”。因此我们使用前导零来表示八进制数字。
十六进制数字怎么样?您可以使用后缀,因此“34x”表示34 16 。然而,解析器必须一直读到数字的末尾才知道如何解释数字(除非它遇到“a”到“f”数字之一,这当然表示十六进制)。解析器“更容易”知道数字是早期的十六进制。但是你仍然需要以数字开头,并且已经使用了零技巧,所以我们还需要其他东西。选择了“x”,现在我们有十六进制的“0x”。
(以上是基于我对解析的理解和关于语言开发的一般历史,而不是基于编译器开发人员或语言委员会做出的具体决策的知识。)
答案 3 :(得分:3)
我不知道......
0代表0ctal
0x是的,好吧,我们已经使用0来表示八进制,并且有一个十六进制的x,所以也在那里塞了
至于自然进展,最好看看可以附加下标的最新编程语言,如
123_27(解释_表示下标)
等等
标记
答案 4 :(得分:2)
base-32有自然进展吗?
这是Ada使用16#形式引入十六进制常量,8#为八进制,2#为二进制等的部分原因。
基于此,我不会过多地关注需要“未来增长”的空间。这不像RAM或寻址空间,每一代都需要更多的数量级。事实上,研究表明八进制和十六进制几乎是人类可读表示的最佳点,它们是二进制兼容的。如果你低于八进制,它开始需要一个简洁的数字来表示更大的数字。如果你高于十六进制,数学表会变得非常大。 Hex实际上已经有点太多了,但是Octal有一个问题就是它不能均匀地适合一个字节。
答案 5 :(得分:1)
Base32有一个标准编码。它与Base64非常相似。但阅读起来并不方便。使用十六进制是因为2个十六进制数字可用于表示1个8位字节。八进制主要用于使用12-bit字节的旧系统。与将原始寄存器显示为二进制文件相比,它可以实现更紧凑的数据表示。
还应该注意的是,有些语言使用o ###表示八进制,x ##或h ##表示十六进制,以及许多其他变体。
答案 6 :(得分:-1)
我认为0x
实际上来自UNIX / Linux世界,并且被C / C ++和其他语言所接受。但我不知道确切的原因或真正的起源。