版权归原作者所有,如有侵权,请联系我们

[科普中国]-八进制

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

简介

Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。一些编程语言中常常以数字0开始表明该数字是八进制。八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中。

八进制(基数为8)表示法在计算机系统中很常见,因此,我们有时能看到人们使用八进制表示法。由于十六进制一位可以对应4位二进制数字,用十六进制来表示二进制较为方便。因此,八进制的应用不如十六进制。有一些程序设计语言提供了使用八进制符号来表示数字的能力,而且还是有一些比较古老的Unix应用在使用八进制。

计算机需要数制转换,计算机内部使用二进制,二进制八进制十进制之间的数制转换,FORTRAN77 编制, 围绕二进制与小数,完成二进制八进制十进制之间的数制转换。1

历史有人提出,原始印欧语系“九”这个词可能与派为“新”字。在此基础上,有人猜测,原始印欧语系使用一个八进制数系统。

1668年约翰·威尔金斯的一篇文章中向一个真正的系统和哲学语言提出使用8为基数,而不是10,因为二分法将数字分为两部分是最自然的方式,据此,这个数字能与下一个数值相统一。

1716年瑞典国王查理十二令Swedenborg阐述基数为64而不是10个。然而Swedenborg认为比国王智力较低的人太难理解,因此提出8为基数。1 - 7的数字有什么用辅音字母l,年代,n,m,t,f,u(v)和零的元音o。因此8 =“lo”,16 =“so”,24 =“no”,64 =“loo”,512 =“looo”等数字连续辅音与元音发音之间依照特殊的规则。[5]

1745年7月,休·琼斯提出一个八进制系统为英国硬币,度量衡。而原因是告诉我们一个统一的标准对所有量更加方便;它被称之为格鲁吉亚标准;他将每个整数划分为八个相等的部分,每个部分又分成8个真实或假想的例子。当时所有国家普遍使用基数十(最初双手的数字),然而8是一个更完整的和宽敞的号码;因为它是整除半,季度,半季度(或单位)没有分数,容易细分 ....甚至在后来的论述“八位计算的琼斯(1753)认为:“八进制算术似乎是最称心如意的事情,同时最接近事物的本质,因此可称为最为自然的数,虽然现在反对使用它,几十年后;这可能是受人欢迎的算术。”

1801年,詹姆斯·安德森批评法国公制基于十进制运算。在他的建议下创造了八进制。建议一个纯粹的八进制度量衡制度和观察到的现有系统英语单位已经很大程度上进化为一个八进制系统。

在19世纪中期,阿尔弗雷德·泰勒认为,“如果我们以八基数,那么将超越所有的计数法”因为它是一个最好的算术系统”。“提案包括新的数字的图形符号和新名称的数字”,包括unty, duty, thety, foty, paty, sety, kity and under等等。例如,数字65十进制(101)在八进制的口语称为under-un。2

在计算机中的应用八进制广泛应用于计算机系统,如PDP-8,ICL 1900和IBM大型机使用12位、24位或36位。八进制是这些基础,因为他们的最理想的二进制字缩写大小能被3整除(每个八进制数字代表三个二进制数字)。四、八到十二个数字可以简明地显示整个机器。它也降低成本使得数字允许通过数码管,七段显示器,和计算器用于操作员控制台,他们在二进制显示使用过于复杂,然而十进制显示需要复杂的硬件,十六进制显示需要显示更多的数字。

然而,所有现代计算平台使用16 - 32位,或者64位,如果使用64位,将进一步划分为八位字节。这种系统三个八进制数字就能满足每字节需要,与最重要的八进制数字代表两个二进制数字(+ 1为下一个字节,如果有的话)。16位字的八进制表示需要6位数,但最重要的八进制数字代表(通过)只有一个(0或1)。这表示无法提供容易阅读的字节,因为它是在4位八进制数字。

因此,今天十六进制为更常用的编程语言,因为两个十六进制数字完全指定一个字节。一些平台的2的幂,字的大小还有指令更容易理解。现代无处不在的x86体系架构也属于这一类,但八进制很少使用这个架构,尽管某些属性的操作码的二进制编码变得更加显而易见,当显示在八进制时,如ModRM字节,它分为2、3和3位,所以八进制可用于描述这些编码。

八进制有时被用于计算而不是十六进制,也许最常在现代与文件权限下Unix系统。它的优点是不需要任何额外的符号位数(十六进制系统是基数16,因此需要六个附加符号超出0 - 9)。它全部用于数字显示。

在编程语言中,八进制文字通常与不同的前缀,包括数字0,字母o或q,digit-letter 0 o组合,或符号&[11]或美元。在摩托罗拉惯例,八进制数字加@前缀,而小字母o作为后缀添加,在英特尔公约。DR-DOS调试使用前缀编辑八进制数字。

例如,文字73(8进制)可以表示为 073, o73, q73, 0o73, \73, @73, &73, $73 or 73o 在各种语言。

新语言已经放弃前缀0,小数常常用前导零表示。避免前缀o被误认为是零,而前缀0开始介绍了o避免数值文字以英文字母(如o或q),因为这些可能会导致文字混淆变量名。前缀0 o也遵循了模型设定的前缀0 x用于十六进制字符C语言;它支持Haskell,OCaml,Perl 6,Python 3.0版本,Ruby,Tcl version 9,它的目的是成为支持ECMAScript 6(前缀0已经废弃的ECMAScript 3和ECMAScript 5[21])。

八进制数字使用在某些编程语言(C、Perl、PostScript…)的文本/图形化表示字节字符串当一些字节值(一个代码页中代表非图形,在当前上下文特殊意义。3

转换二进制与八进制的互相转换和二进制与十六进制的转换类似,区别在于需要操作的是三位一组而不是四位。表2-2列出了二进制与八进制的等效表示。

为了把八进制数换算为二进制,将每一个八进制数字替换成表2-2中对应的三位。例如,八进制123换算成二进制的结果就是001010011:

|| ||

表2-2 二进制/八进制换算表

|| ||

为了将一个二进制数换算为八进制,只需将二进制串划分成每三个位一组(如果需要的话,在前面补零),然后查表2-2,将三位一组的位串替换为相应的八进制数字即可。

如果需要将八进制数换算为十六进制,只需将八进制数换算为二进制,然后再换算为十六进制即可。

八进制化为****十进制:

例:将八进制数12转换成十进制数

八进制化为二进制:

规则:按照顺序,每1位八进制数改写成等值的3位二进制数,次序不变。

例: (17.36)8 = (001 111 .011 110)2 = (1111.01111)2

八进制化为十六进制

先将八进制化为二进制,再将二进制化为十六进制。

例:(712)8 = (1110 0101 0)2 = (1CA)16

转换为八进制

二进制化为八进制:

整数部份从最低有效位开始,以3位一组,最高有效位不足3位时以0补齐,每一组均可转换成一个八进制的值,转换完毕就是八进制的整数。

小数部份从最高有效位开始,以3位一组,最低有效位不足3位时以0补齐,每一组均可转换成一个八进制的值,转换完毕就是八进制的小数。

例:(11001111.01111)2 = (011 001 111.011 110)2 = (317.36)8

十六进制化为八进制:

先用1化4方法,将十六进制化为二进制;再用3并1方法,将二进制化为8制。

例: (1CA)16 = (111001010)2 = (712)8

说明:小数点前的高位零和小数点后的低位零可以去除。

十进制****化八进制

方法1:采用除8取余法。

例:将十进制数115转化为八进制数

8| 115…… 3

8| 14 …… 6

8| 1 …… 1

结果:(115)10 = (163)8

方法2:先采用十进制化二进制的方法,再将二进制数化为八进制数

例:(115)10 = (1110011)2 = (163)8

C语言中的表达

在C语言里,整数有三种表示形式:十进制,八进制,十六进制。其中以数字0开头,由0~7组成的数是八进制。以0X或0x开头,由0~9,A~F或a~f 组成是十六进制。除表示正负的符号外,以1~9开头,由0~9组成是十进制。1.十进制:除表示正负的符号外,以1~9开头,由0~9组成。如,128,+234,-278。2,八进制:以0开头,由0~7组成的数。如,0126,050000.3,十六进制:以0X或0x开头,由0~9,A~F或a~f 组成。如,0x12A,0x5a000。