Octal

Last updated
Numeral systems, bits and Gray code
hex dec oct 3210 step
0hex00dec00oct0000g0
1hex01dec01oct0001h1
2hex02dec02oct0010j3
3hex03dec03oct0011i2
4hex04dec04oct0100n7
5hex05dec05oct0101m6
6hex06dec06oct0110k4
7hex07dec07oct0111l5
8hex08dec10oct1000vF
9hex09dec11oct1001uE
Ahex10dec12oct1010sC
Bhex11dec13oct1011tD
Chex12dec14oct1100o8
Dhex13dec15oct1101p9
Ehex14dec16oct1110rB
Fhex15dec17oct1111qA

Octal (base 8) is a numeral system with eight as the base.

Contents

In the decimal system, each place is a power of ten. For example:

In the octal system, each place is a power of eight. For example:

By performing the calculation above in the familiar decimal system, we see why 112 in octal is equal to in decimal.

Octal numerals can be easily converted from binary representations (similar to a quaternary numeral system) by grouping consecutive binary digits into groups of three (starting from the right, for integers). For example, the binary representation for decimal 74 is 1001010. Two zeroes can be added at the left: (00)1 001 010, corresponding to the octal digits 1 1 2, yielding the octal representation 112.

The octal multiplication table
×123456710
1123456710
22461012141620
336111417222530
4410142024303440
5512172431364350
6614223036445260
7716253443526170
1010203040506070100

Usage

In China

Fuxi's "Earlier Heaven" Arrangement of the Eight Trigrams Bagua-name-earlier.svg
Fuxi's "Earlier Heaven" Arrangement of the Eight Trigrams

The eight bagua or trigrams of the I Ching correspond to octal digits:

Gottfried Wilhelm Leibniz made the connection between trigrams, hexagrams and binary numbers in 1703. [1]

By Native Americans

By Europeans

In computers

Octal became widely used in computing when systems such as the UNIVAC 1050, PDP-8, ICL 1900 and IBM mainframes employed 6-bit, 12-bit, 24-bit or 36-bit words. Octal was an ideal abbreviation of binary for these machines because their word size is divisible by three (each octal digit represents three binary digits). So two, four, eight or twelve digits could concisely display an entire machine word. It also cut costs by allowing Nixie tubes, seven-segment displays, and calculators to be used for the operator consoles, where binary displays were too complex to use, decimal displays needed complex hardware to convert radices, and hexadecimal displays needed to display more numerals.

All modern computing platforms, however, use 16-, 32-, or 64-bit words, further divided into eight-bit bytes. On such systems three octal digits per byte would be required, with the most significant octal digit representing two binary digits (plus one bit of the next significant byte, if any). Octal representation of a 16-bit word requires 6 digits, but the most significant octal digit represents (quite inelegantly) only one bit (0 or 1). This representation offers no way to easily read the most significant byte, because it's smeared over four octal digits. Therefore, hexadecimal is more commonly used in programming languages today, since two hexadecimal digits exactly specify one byte. Some platforms with a power-of-two word size still have instruction subwords that are more easily understood if displayed in octal; this includes the PDP-11 and Motorola 68000 family. The modern-day ubiquitous x86 architecture belongs to this category as well, but octal is rarely used on this platform, although certain properties of the binary encoding of opcodes become more readily apparent when displayed in octal, e.g. the ModRM byte, which is divided into fields of 2, 3, and 3 bits, so octal can be useful in describing these encodings. Before the availability of assemblers, some programmers would handcode programs in octal; for instance, Dick Whipple and John Arnold wrote Tiny BASIC Extended directly in machine code, using octal. [11]

Octal is sometimes used in computing instead of hexadecimal, perhaps most often in modern times in conjunction with file permissions under Unix systems (see chmod). It has the advantage of not requiring any extra symbols as digits (the hexadecimal system is base-16 and therefore needs six additional symbols beyond 0–9).

In programming languages, octal literals are typically identified with a variety of prefixes, including the digit 0, the letters o or q, the digit–letter combination 0o, or the symbol & [12] or $. In Motorola convention, octal numbers are prefixed with @, whereas a small (or capital [13] ) letter o [13] or q [13] is added as a postfix following the Intel convention. [14] [15] In Concurrent DOS, Multiuser DOS and REAL/32 as well as in DOS Plus and DR-DOS various environment variables like $CLS, $ON, $OFF, $HEADER or $FOOTER support an \nnn octal number notation, [16] [17] [18] and DR-DOS DEBUG utilizes \ to prefix octal numbers as well.

For example, the literal 73 (base 8) might be represented as 073, o73, q73, 0o73, \73, @73, &73, $73 or 73o in various languages.

Newer languages have been abandoning the prefix 0, as decimal numbers are often represented with leading zeroes. The prefix q was introduced to avoid the prefix o being mistaken for a zero, while the prefix 0o was introduced to avoid starting a numerical literal with an alphabetic character (like o or q), since these might cause the literal to be confused with a variable name. The prefix 0o also follows the model set by the prefix 0x used for hexadecimal literals in the C language; it is supported by Haskell, [19] OCaml, [20] Python as of version 3.0, [21] Raku, [22] Ruby, [23] Tcl as of version 9, [24] PHP as of version 8.1, [25] Rust [26] and ECMAScript as of ECMAScript 6 [27] (the prefix 0 originally stood for base 8 in JavaScript but could cause confusion, [28] therefore it has been discouraged in ECMAScript 3 and dropped in ECMAScript 5 [29] ).

Octal numbers that are used in some programming languages (C, Perl, PostScript...) for textual/graphical representations of byte strings when some byte values (unrepresented in a code page, non-graphical, having special meaning in current context or otherwise undesired) have to be to escaped as \nnn. Octal representation may be particularly handy with non-ASCII bytes of UTF-8, which encodes groups of 6 bits, and where any start byte has octal value \3nn and any continuation byte has octal value \2nn.

Octal was also used for floating point in the Ferranti Atlas (1962), Burroughs B5500 (1964), Burroughs B5700 (1971), Burroughs B6700 (1971) and Burroughs B7700 (1972) computers.

In aviation

Transponders in aircraft transmit a "squawk" code, expressed as a four-octal-digit number, when interrogated by ground radar. This code is used to distinguish different aircraft on the radar screen.

Conversion between bases

Decimal to octal conversion

Method of successive Euclidean division by 8

To convert integer decimals to octal, divide the original number by the largest possible power of 8 and divide the remainders by successively smaller powers of 8 until the power is 1. The octal representation is formed by the quotients, written in the order generated by the algorithm. For example, to convert 12510 to octal:

125 = 82 × 1 + 61
61 = 81 × 7 + 5
5 = 80 × 5 + 0

Therefore, 12510 = 1758.

Another example:

900 = 83 × 1 + 388
388 = 82 × 6 + 4
4 = 81 × 0 + 4
4 = 80 × 4 + 0

Therefore, 90010 = 16048.

Method of successive multiplication by 8

To convert a decimal fraction to octal, multiply by 8; the integer part of the result is the first digit of the octal fraction. Repeat the process with the fractional part of the result, until it is null or within acceptable error bounds.

Example: Convert 0.1640625 to octal:

0.1640625 × 8 = 1.3125 = 1 + 0.3125
0.3125 × 8 = 2.5 = 2 + 0.5
0.5 × 8 = 4.0 = 4 + 0

Therefore, 0.164062510 = 0.1248.

These two methods can be combined to handle decimal numbers with both integer and fractional parts, using the first on the integer part and the second on the fractional part.

Method of successive duplication

To convert integer decimals to octal, prefix the number with "0.". Perform the following steps for as long as digits remain on the right side of the radix: Double the value to the left side of the radix, using octal rules, move the radix point one digit rightward, and then place the doubled value underneath the current value so that the radix points align. If the moved radix point crosses over a digit that is 8 or 9, convert it to 0 or 1 and add the carry to the next leftward digit of the current value. Addoctally those digits to the left of the radix and simply drop down those digits to the right, without modification.

Example:

 0.4 9 1 8 decimal value   +0  ---------    4.9 1 8   +1 0   --------    6 1.1 8   +1 4 2   --------    7 5 3.8   +1 7 2 6   --------  1 1 4 6 6. octal value 

Octal to decimal conversion

To convert a number k to decimal, use the formula that defines its base-8 representation:

In this formula, ai is an individual octal digit being converted, where i is the position of the digit (counting from 0 for the right-most digit).

Example: Convert 7648 to decimal:

7648 = 7 × 82 + 6 × 81 + 4 × 80 = 448 + 48 + 4 = 50010

For double-digit octal numbers this method amounts to multiplying the lead digit by 8 and adding the second digit to get the total.

Example: 658 = 6 × 8 + 5 = 5310

Method of successive duplication

To convert octals to decimals, prefix the number with "0.". Perform the following steps for as long as digits remain on the right side of the radix: Double the value to the left side of the radix, using decimal rules, move the radix point one digit rightward, and then place the doubled value underneath the current value so that the radix points align. Subtractdecimally those digits to the left of the radix and simply drop down those digits to the right, without modification.

Example:

 0.1 1 4 6 6  octal value   -0  -----------    1.1 4 6 6   -  2   ----------      9.4 6 6   -  1 8   ----------      7 6.6 6   -  1 5 2   ----------      6 1 4.6   -  1 2 2 8   ----------      4 9 1 8. decimal value 

Octal to binary conversion

To convert octal to binary, replace each octal digit by its binary representation.

Example: Convert 518 to binary:

58 = 1012
18 = 0012

Therefore, 518 = 101 0012.

Binary to octal conversion

The process is the reverse of the previous algorithm. The binary digits are grouped by threes, starting from the least significant bit and proceeding to the left and to the right. Add leading zeroes (or trailing zeroes to the right of decimal point) to fill out the last group of three if necessary. Then replace each trio with the equivalent octal digit.

For instance, convert binary 1010111100 to octal:

001010111100
1274

Therefore, 10101111002 = 12748.

Convert binary 11100.01001 to octal:

011100 . 010010
34 . 22

Therefore, 11100.010012 = 34.228.

Octal to hexadecimal conversion

The conversion is made in two steps using binary as an intermediate base. Octal is converted to binary and then binary to hexadecimal, grouping digits by fours, which correspond each to a hexadecimal digit.

For instance, convert octal 1057 to hexadecimal:

To binary:
1057
001000101111
then to hexadecimal:
001000101111
22F

Therefore, 10578 = 22F16.

Hexadecimal to octal conversion

Hexadecimal to octal conversion proceeds by first converting the hexadecimal digits to 4-bit binary values, then regrouping the binary bits into 3-bit octal digits.

For example, to convert 3FA516:

To binary:
3FA5
0011111110100101
then to octal:
0011111110100101
037645

Therefore, 3FA516 = 376458.

Real numbers

Fractions

Due to having only factors of two, many octal fractions have repeating digits, although these tend to be fairly simple:

Decimal base
Prime factors of the base: 2, 5
Prime factors of one below the base: 3
Prime factors of one above the base: 11
Other Prime factors: 7 13 17 19 23 29 31
Octal base
Prime factors of the base: 2
Prime factors of one below the base: 7
Prime factors of one above the base: 3
Other Prime factors: 5 13 15 21 23 27 35 37
FractionPrime factors
of the denominator
Positional representationPositional representationPrime factors
of the denominator
Fraction
1/220.50.421/2
1/330.3333... = 0.30.2525... = 0.2531/3
1/420.250.221/4
1/550.20.146351/5
1/62, 30.160.1252, 31/6
1/770.1428570.171/7
1/820.1250.121/10
1/930.10.0731/11
1/102, 50.10.063142, 51/12
1/11110.090.0564272135131/13
1/122, 30.0830.0522, 31/14
1/13130.0769230.0473151/15
1/142, 70.07142850.042, 71/16
1/153, 50.060.04213, 51/17
1/1620.06250.0421/20
1/17170.05882352941176470.03607417211/21
1/182, 30.050.0342, 31/22
1/19190.0526315789473684210.032745231/23
1/202, 50.050.031462, 51/24
1/213, 70.0476190.033, 71/25
1/222, 110.0450.027213505642, 131/26
1/23230.04347826086956521739130.02620544131271/27
1/242, 30.04160.0252, 31/30
1/2550.040.0243656050753412172751/31
1/262, 130.03846150.023542, 151/32
1/2730.0370.02275531/33
1/282, 70.035714280.022, 71/34
1/29290.03448275862068965517241379310.0215173454106475626043236713351/35
1/302, 3, 50.030.021042, 3, 51/36
1/31310.0322580645161290.02041371/37
1/3220.031250.0221/40

Irrational numbers

The table below gives the expansions of some common irrational numbers in decimal and octal.

NumberPositional representation
DecimalOctal
2 (the length of the diagonal of a unit square)1.414213562373095048...1.3240 4746 3177 1674...
3 (the length of the diagonal of a unit cube)1.732050807568877293...1.5666 3656 4130 2312...
5 (the length of the diagonal of a 1×2 rectangle)2.236067977499789696...2.1706 7363 3457 7224...
φ (phi, the golden ratio = (1+5)/2)1.618033988749894848...1.4743 3571 5627 7512...
π (pi, the ratio of circumference to diameter of a circle)3.141592653589793238462643
383279502884197169399375105...
3.1103 7552 4210 2643...
e (the base of the natural logarithm)2.718281828459045235...2.5576 0521 3050 5355...

See also

Related Research Articles

<span class="mw-page-title-main">Binary-coded decimal</span> System of digitally encoding numbers

In computing and electronic systems, binary-coded decimal (BCD) is a class of binary encodings of decimal numbers where each digit is represented by a fixed number of bits, usually four or eight. Sometimes, special bit patterns are used for a sign or other indications.

<span class="mw-page-title-main">Floating-point arithmetic</span> Computer approximation for real numbers

In computing, floating-point arithmetic (FP) is arithmetic that represents subsets of real numbers using an integer with a fixed precision, called the significand, scaled by an integer exponent of a fixed base. Numbers of this form are called floating-point numbers. For example, 12.345 is a floating-point number in base ten with five digits of precision:

In mathematics and computing, the hexadecimal numeral system is a positional numeral system that represents numbers using a radix (base) of sixteen. Unlike the decimal system representing numbers using ten symbols, hexadecimal uses sixteen distinct symbols, most often the symbols "0"–"9" to represent values 0 to 9 and "A"–"F" to represent values from ten to fifteen.

In computer science, an integer is a datum of integral data type, a data type that represents some range of mathematical integers. Integral data types may be of different sizes and may or may not be allowed to contain negative values. Integers are commonly represented in a computer as a group of binary digits (bits). The size of the grouping varies so the set of integer sizes available varies between different types of computers. Computer hardware nearly always provides a way to represent a processor register or memory address as an integer.

A computer number format is the internal representation of numeric values in digital device hardware and software, such as in programmable computers and calculators. Numerical values are stored as groupings of bits, such as bytes and words. The encoding between numerical values and bit patterns is chosen for convenience of the operation of the computer; the encoding used by the computer's instruction set generally requires conversion for external use, such as for printing and display. Different types of processors may have different internal representations of numerical values and different conventions are used for integer and real numbers. Most calculations are carried out with number formats that fit into a processor register, but some software systems allow representation of arbitrarily large numbers using multiple words of memory.

Double-precision floating-point format is a floating-point number format, usually occupying 64 bits in computer memory; it represents a wide dynamic range of numeric values by using a floating radix point.

A ternary numeral system has three as its base. Analogous to a bit, a ternary digit is a trit. One trit is equivalent to log2 3 bits of information.

A binary number is a number expressed in the base-2 numeral system or binary numeral system, a method for representing numbers that uses only two symbols for the natural numbers: typically "0" (zero) and "1" (one). A binary number may also refer to a rational number that has a finite representation in the binary numeral system, that is, the quotient of an integer by a power of two.

A numerical digit or numeral is a single symbol used alone or in combinations, to represent numbers in a positional numeral system. The name "digit" comes from the fact that the ten digits of the hands correspond to the ten symbols of the common base 10 numeral system, i.e. the decimal digits.

Quaternary is a numeral system with four as its base. It uses the digits 0, 1, 2, and 3 to represent any real number. Conversion from binary is straightforward.

<span class="mw-page-title-main">Positional notation</span> Method for representing or encoding numbers

Positional notation usually denotes the extension to any base of the Hindu–Arabic numeral system. More generally, a positional system is a numeral system in which the contribution of a digit to the value of a number is the value of the digit multiplied by a factor determined by the position of the digit. In early numeral systems, such as Roman numerals, a digit has only one value: I means one, X means ten and C a hundred. In modern positional systems, such as the decimal system, the position of the digit means that its value must be multiplied by some value: in 555, the three identical symbols represent five hundreds, five tens, and five units, respectively, due to their different positions in the digit string.

Hexadecimal floating point is a format for encoding floating-point numbers first introduced on the IBM System/360 computers, and supported on subsequent machines based on that architecture, as well as machines which were intended to be application-compatible with System/360.

In a positional numeral system, the radix or base is the number of unique digits, including the digit zero, used to represent numbers. For example, for the decimal system the radix is ten, because it uses the ten digits from 0 through 9.

The Intel BCD opcodes are a set of six x86 instructions that operate with binary-coded decimal numbers. The radix used for the representation of numbers in the x86 processors is 2. This is called a binary numeral system. However, the x86 processors do have limited support for the decimal numeral system.

Base36 is a binary-to-text encoding scheme that represents binary data in an ASCII string format by translating it into a radix-36 representation. The choice of 36 is convenient in that the digits can be represented using the Arabic numerals 0–9 and the Latin letters A–Z.

Non-standard positional numeral systems here designates numeral systems that may loosely be described as positional systems, but that do not entirely comply with the following description of standard positional systems:

A negative base may be used to construct a non-standard positional numeral system. Like other place-value systems, each position holds multiples of the appropriate power of the system's base; but that base is negative—that is to say, the base b is equal to −r for some natural number r.

In computing, bit numbering is the convention used to identify the bit positions in a binary number.

In the C programming language, an escape sequence is specially delimited text in a character or string literal that represents one or more other characters to the compiler. It allows a programmer to specify characters that are otherwise difficult or impossible to specify in a literal.

In computer science, an integer literal is a kind of literal for an integer whose value is directly represented in source code. For example, in the assignment statement x = 1, the string 1 is an integer literal indicating the value 1, while in the statement x = 0x10 the string 0x10 is an integer literal indicating the value 16, which is represented by 10 in hexadecimal.

References

  1. Leibniz, Gottfried Wilhelm (1703). "Explanation of binary arithmetic". leibniz-translations.com. Archived from the original on 2021-02-11. Retrieved 2022-03-02.
  2. Ascher, Marcia (1992). "Ethnomathematics: A Multicultural View of Mathematical Ideas". The College Mathematics Journal. 23 (4): 353–355. doi:10.2307/2686959. JSTOR   2686959.
  3. Avelino, Heriberto (2006). "The typology of Pame number systems and the limits of Mesoamerica as a linguistic area" (PDF). Linguistic Typology. 10 (1): 41–60. doi:10.1515/LINGTY.2006.002. S2CID   20412558. Archived (PDF) from the original on 2011-06-04. Retrieved 2007-11-21.
  4. Winter, Werner (1991). "Some thoughts about Indo-European numerals". In Gvozdanović, Jadranka (ed.). Indo-European numerals. Trends in Linguistics. Vol. 57. Berlin: Mouton de Gruyter. pp. 13–14. ISBN   3-11-011322-8. Archived from the original on 2023-04-01. Retrieved 2013-06-09.
  5. Wilkins, John (1668). An Essay Towards a Real Character and a Philosophical Language. London. p. 190. Archived from the original on 2023-04-01. Retrieved 2015-02-08.
  6. Donald Knuth, The Art of Computer Programming
  7. See H. R. Phalen, "Hugh Jones and Octave Computation," The American Mathematical Monthly 56 (August–September 1949): 461-465.
  8. James Anderson, On Octal Arithmetic [title appears only in page headers], Recreations in Agriculture, Natural-History, Arts, and Miscellaneous Literature Archived 2023-04-01 at the Wayback Machine , Vol. IV, No. 6 (February 1801), T. Bensley, London; pages 437-448.
  9. Alfred B. Taylor, Report on Weights and Measures, Pharmaceutical Association, 8th Annual Session, Boston, 1859-09-15. See pages 48 and 53.
  10. Alfred B. Taylor, Octonary numeration and its application to a system of weights and measures, Proc. Amer. Phil. Soc. Vol XXIV Archived 2023-04-01 at the Wayback Machine , Philadelphia, 1887; pages 296-366. See pages 327 and 330.
  11. "TB Code Sheet". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte . 1 (1). December 1975.
  12. Microsoft Corporation (1987). "Constants, Variables, Expressions and Operators". GW-BASIC User's Manual. Archived from the original on 2016-01-05. Retrieved 2015-12-12.
  13. 1 2 3 "2.4.1 Numeric Constants". CP/M-86 - Operating System - Programmer's Guide (PDF) (3 ed.). Pacific Grove, California, USA: Digital Research. January 1983 [1981]. p. 9. Archived (PDF) from the original on 2020-02-27. Retrieved 2020-02-27. (1+viii+122+2 pages)
  14. Küveler, Gerd; Schwoch, Dietrich (2013) [1996]. Arbeitsbuch Informatik - eine praxisorientierte Einführung in die Datenverarbeitung mit Projektaufgabe (in German). Vieweg-Verlag, reprint: Springer-Verlag. doi:10.1007/978-3-322-92907-5. ISBN   978-3-528-04952-2. 978-3-32292907-5. Archived from the original on 2023-04-01. Retrieved 2015-08-05.
  15. Küveler, Gerd; Schwoch, Dietrich (2007-10-04). Informatik für Ingenieure und Naturwissenschaftler: PC- und Mikrocomputertechnik, Rechnernetze (in German). Vol. 2 (5 ed.). Vieweg, reprint: Springer-Verlag. ISBN   978-3-83489191-4. 978-3-83489191-4. Archived from the original on 2023-04-01. Retrieved 2015-08-05.
  16. Paul, Matthias R. (1997-07-30). "NWDOS-TIPs — Tips & Tricks rund um Novell DOS 7, mit Blick auf undokumentierte Details, Bugs und Workarounds". MPDOSTIP. Release 157 (in German) (3 ed.). Archived from the original on 2016-11-04. Retrieved 2014-08-06. (NB. NWDOSTIP.TXT is a comprehensive work on Novell DOS 7 and OpenDOS 7.01, including the description of many undocumented features and internals. It is part of the author's yet larger MPDOSTIP.ZIP collection maintained up to 2001 and distributed on many sites at the time. The provided link points to a HTML-converted older version of the NWDOSTIP.TXT file.)
  17. Paul, Matthias R. (2002-03-26). "Updated CLS posted". freedos-dev mailing list. Archived from the original on 2019-04-27. Retrieved 2014-08-06.
  18. CCI Multiuser DOS 7.22 GOLD Online Documentation. Concurrent Controls, Inc. (CCI). 1997-02-10. HELP.HLP.
  19. "Haskell 98 Lexical Structure". Archived from the original on 2021-04-11. Retrieved 2019-11-01.
  20. OCaml: 7.1 Lexical conventions Archived 2013-07-01 at archive.today
  21. Python 3: https://docs.python.org/3.1/reference/lexical_analysis.html#integer-literals Archived 2014-03-20 at the Wayback Machine
  22. Perl 6: http://perlcabal.org/syn/S02.html#Radix_markers Archived 31 October 2014 at the Wayback Machine
  23. RubySpec: https://github.com/ruby/ruby/blob/master/spec/ruby/core/string/to_i_spec.rb Archived 2022-05-29 at the Wayback Machine
  24. Tcl: http://wiki.tcl.tk/498 Archived 2014-01-04 at the Wayback Machine
  25. PHP.Watch - PHP 8.1: Explicit Octal numeral notation https://php.watch/versions/8.1/explicit-octal-notation Archived 2021-01-08 at the Wayback Machine
  26. Rust literals and operators: https://doc.rust-lang.org/rust-by-example/primitives/literals.html Archived 2022-05-28 at the Wayback Machine
  27. ECMAScript 6th Edition draft: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-numeric-literals Archived 16 December 2013 at the Wayback Machine
  28. "Why does the radix for JavaScript's parseInt default to 8?". Stack Overflow. 2011-04-08. Archived from the original on 2020-08-06. Retrieved 2019-08-21.
  29. "parseInt()", Mozilla Developer Network (MDN), archived from the original on 2014-03-05, retrieved 2014-01-03, If the input string begins with "0" (a zero), radix is assumed to be 8 (octal) or 10 (decimal). Exactly which radix is chosen is implementation-dependent. ECMAScript 5 clarifies that 10 (decimal) should be used, but not all browsers support this yet