八進位
一種以8為基數的計數法
八進位,Octal,縮寫OCT或O,一種以8為基數的計數法,採用0,1,2,3,4,5,6,7八個數字,逢八進1。一些編程語言中常常以數字0開始表明該數字是八進位。八進位的數和二進位數可以按位對應(八進位一位對應二進位三位),因此常應用在計算機語言中。
八進位(基數為8)表示法在計算機系統中很常見,因此,我們有時能看到人們使用八進位表示法。由於十六進位一位可以對應4位二進位數字,用十六進位來表示二進位較為方便。因此,八進位的應用不如十六進位。有一些程序設計語言提供了使用八進位符號來表示數字的能力,而且還是有一些比較古老的Unix應用在使用八進位。
計算機需要數制轉換,計算機內部使用二進位,二進位八進位十進位之間的數制轉換,FORTRAN77編製,圍繞二進位與小數,完成二進位八進位十進位之間的數制轉換。
有人提出,原始印歐語系“九”這個詞可能與派為“新”字。在此基礎上,有人猜測,原始印歐語系使用一個八進位數系統。
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,kityandunder等等。例如,數字65十進位(101)在八進位的口語稱為under-un。
八進位廣泛應用於計算機系統,如PDP-8,ICL1900和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-letter0o組合,或符號&[11]或美元。在摩托羅拉慣例,八進位數字加@前綴,而小字母o作為後綴添加,在英特爾公約。DR-DOS調試使用前綴編輯八進位數字。
例如,文字73(8進位)可以表示為073,o73,q73,0o73,\73,@73,&73,$73or73o在各種語言。
新語言已經放棄前綴0,小數常常用前導零表示。避免前綴o被誤認為是零,而前綴0開始介紹了o避免數值文字以英文字母(如o或q),因為這些可能會導致文字混淆變數名。前綴0o也遵循了模型設定的前綴0x用於十六進位字元C語言;它支持Haskell,OCaml,Perl6,Python3.0版本,Ruby,Tclversion9,它的目的是成為支持ECMAScript6(前綴0已經廢棄的ECMAScript3和ECMAScript5[21])。
八進位數字使用在某些編程語言(C、Perl、PostScript…)的文本/圖形化表示位元組字元串當一些位元組值(一個代碼頁中代表非圖形,在當前上下文特殊意義。
二進位與八進位的互相轉換和二進位與十六進位的轉換類似,區別在於需要操作的是三位一組而不是四位。表2-2列出了二進位與八進位的等效表示。
為了把八進位數換算為二進位,將每一個八進位數字替換成表2-2中對應的三位。例如,八進位123換算成二進位的結果就是001010011:
1 | 2 | 3 |
001 | 010 | 011 |
表2-2二進位/八進位換算表
二進位 | 八進位 |
000 | |
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
為了將一個二進位數換算為八進位,只需將二進位串劃分成每三個位一組(如果需要的話,在前面補零),然後查表2-2,將三位一組的位串替換為相應的八進位數字即可。
如果需要將八進位數換算為十六進位,只需將八進位數換算為二進位,然後再換算為十六進位即可。
八進位化為十進位:
例:將八進位數12轉換成十進位數
八進位化為二進位:
規則:按照順序,每1位八進位數改寫成等值的3位二進位數,次序不變。
例:(17.36)8=(001111.011110)2=(1111.01111)2
八進位化為十六進位
先將八進位化為二進位,再將二進位化為十六進位。
例:(712)8=(111001010)2=(1CA)16
轉換為八進位
二進位化為八進位:
整數部份從最低有效位開始,以3位一組,最高有效位不足3位時以0補齊,每一組均可轉換成一個八進位的值,轉換完畢就是八進位的整數。
小數部份從最高有效位開始,以3位一組,最低有效位不足3位時以0補齊,每一組均可轉換成一個八進位的值,轉換完畢就是八進位的小數。
例:(11001111.01111)2=(011001111.011110)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。
八進位