hex | dec | oct | 3 | 2 | 1 | 0 | step |
---|---|---|---|---|---|---|---|
0_{hex} | 0_{dec} | 0_{oct} | 0 | 0 | 0 | 0 | 0 |
1_{hex} | 1_{dec} | 1_{oct} | 0 | 0 | 0 | 1 | 1 |
2_{hex} | 2_{dec} | 2_{oct} | 0 | 0 | 1 | 0 | 3 |
3_{hex} | 3_{dec} | 3_{oct} | 0 | 0 | 1 | 1 | 2 |
4_{hex} | 4_{dec} | 4_{oct} | 0 | 1 | 0 | 0 | 7 |
5_{hex} | 5_{dec} | 5_{oct} | 0 | 1 | 0 | 1 | 6 |
6_{hex} | 6_{dec} | 6_{oct} | 0 | 1 | 1 | 0 | 4 |
7_{hex} | 7_{dec} | 7_{oct} | 0 | 1 | 1 | 1 | 5 |
8_{hex} | 8_{dec} | 10_{oct} | 1 | 0 | 0 | 0 | F |
9_{hex} | 9_{dec} | 11_{oct} | 1 | 0 | 0 | 1 | E |
A_{hex} | 10_{dec} | 12_{oct} | 1 | 0 | 1 | 0 | C |
B_{hex} | 11_{dec} | 13_{oct} | 1 | 0 | 1 | 1 | D |
C_{hex} | 12_{dec} | 14_{oct} | 1 | 1 | 0 | 0 | 8 |
D_{hex} | 13_{dec} | 15_{oct} | 1 | 1 | 0 | 1 | 9 |
E_{hex} | 14_{dec} | 16_{oct} | 1 | 1 | 1 | 0 | B |
F_{hex} | 15_{dec} | 17_{oct} | 1 | 1 | 1 | 1 | A |
Part of a series on |
Numeral systems |
---|
List of numeral systems |
Octal (base 8) is a numeral system with eight as the base.
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.
× | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 |
1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 |
2 | 2 | 4 | 6 | 10 | 12 | 14 | 16 | 20 |
3 | 3 | 6 | 11 | 14 | 17 | 22 | 25 | 30 |
4 | 4 | 10 | 14 | 20 | 24 | 30 | 34 | 40 |
5 | 5 | 12 | 17 | 24 | 31 | 36 | 43 | 50 |
6 | 6 | 14 | 22 | 30 | 36 | 44 | 52 | 60 |
7 | 7 | 16 | 25 | 34 | 43 | 52 | 61 | 70 |
10 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 100 |
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]}
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). It is also used for digital displays.
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.
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.
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 125_{10} to octal:
Therefore, 125_{10} = 175_{8}.
Another example:
Therefore, 900_{10} = 1604_{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:
Therefore, 0.1640625_{10} = 0.124_{8}.
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.
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. Add octally 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
To convert a number k to decimal, use the formula that defines its base-8 representation:
In this formula, a_{i} 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 764_{8} to decimal:
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: 65_{8} = 6 × 8 + 5 = 53_{10}
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. Subtract decimally 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
To convert octal to binary, replace each octal digit by its binary representation.
Example: Convert 51_{8} to binary:
Therefore, 51_{8} = 101 001_{2}.
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:
001 | 010 | 111 | 100 |
1 | 2 | 7 | 4 |
Therefore, 1010111100_{2} = 1274_{8}.
Convert binary 11100.01001 to octal:
011 | 100 | . | 010 | 010 |
3 | 4 | . | 2 | 2 |
Therefore, 11100.01001_{2} = 34.22_{8}.
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:
1 | 0 | 5 | 7 |
001 | 000 | 101 | 111 |
0010 | 0010 | 1111 |
2 | 2 | F |
Therefore, 1057_{8} = 22F_{16}.
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 3FA5_{16}:
3 | F | A | 5 |
0011 | 1111 | 1010 | 0101 |
0 | 011 | 111 | 110 | 100 | 101 |
0 | 3 | 7 | 6 | 4 | 5 |
Therefore, 3FA5_{16} = 37645_{8}.
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 | ||||
Fraction | Prime factors of the denominator |
Positional representation | Positional representation | Prime factors of the denominator |
Fraction |
1/2 | 2 | 0.5 | 0.4 | 2 | 1/2 |
1/3 | 3 | 0.3333... = 0.3 | 0.2525... = 0.25 | 3 | 1/3 |
1/4 | 2 | 0.25 | 0.2 | 2 | 1/4 |
1/5 | 5 | 0.2 | 0.1463 | 5 | 1/5 |
1/6 | 2, 3 | 0.16 | 0.125 | 2, 3 | 1/6 |
1/7 | 7 | 0.142857 | 0.1 | 7 | 1/7 |
1/8 | 2 | 0.125 | 0.1 | 2 | 1/10 |
1/9 | 3 | 0.1 | 0.07 | 3 | 1/11 |
1/10 | 2, 5 | 0.1 | 0.06314 | 2, 5 | 1/12 |
1/11 | 11 | 0.09 | 0.0564272135 | 13 | 1/13 |
1/12 | 2, 3 | 0.083 | 0.052 | 2, 3 | 1/14 |
1/13 | 13 | 0.076923 | 0.0473 | 15 | 1/15 |
1/14 | 2, 7 | 0.0714285 | 0.04 | 2, 7 | 1/16 |
1/15 | 3, 5 | 0.06 | 0.0421 | 3, 5 | 1/17 |
1/16 | 2 | 0.0625 | 0.04 | 2 | 1/20 |
1/17 | 17 | 0.0588235294117647 | 0.03607417 | 21 | 1/21 |
1/18 | 2, 3 | 0.05 | 0.034 | 2, 3 | 1/22 |
1/19 | 19 | 0.052631578947368421 | 0.032745 | 23 | 1/23 |
1/20 | 2, 5 | 0.05 | 0.03146 | 2, 5 | 1/24 |
1/21 | 3, 7 | 0.047619 | 0.03 | 3, 7 | 1/25 |
1/22 | 2, 11 | 0.045 | 0.02721350564 | 2, 13 | 1/26 |
1/23 | 23 | 0.0434782608695652173913 | 0.02620544131 | 27 | 1/27 |
1/24 | 2, 3 | 0.0416 | 0.025 | 2, 3 | 1/30 |
1/25 | 5 | 0.04 | 0.02436560507534121727 | 5 | 1/31 |
1/26 | 2, 13 | 0.0384615 | 0.02354 | 2, 15 | 1/32 |
1/27 | 3 | 0.037 | 0.022755 | 3 | 1/33 |
1/28 | 2, 7 | 0.03571428 | 0.02 | 2, 7 | 1/34 |
1/29 | 29 | 0.0344827586206896551724137931 | 0.0215173454106475626043236713 | 35 | 1/35 |
1/30 | 2, 3, 5 | 0.03 | 0.02104 | 2, 3, 5 | 1/36 |
1/31 | 31 | 0.032258064516129 | 0.02041 | 37 | 1/37 |
1/32 | 2 | 0.03125 | 0.02 | 2 | 1/40 |
The table below gives the expansions of some common irrational numbers in decimal and octal.
Number | Positional representation | |
---|---|---|
Decimal | Octal | |
√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... |