8진법

8진법(八進法, 영어: octal, oct)은 8을 밑(base)으로 하는 숫자 표현 체계이다. 0부터 7까지의 여덟 가지 숫자(0, 1, 2, 3, 4, 5, 6, 7)를 사용하여 수를 나타내며, 각 자리는 8의 거듭제곱을 나타낸다. 주로 컴퓨터 과학에서 2진수를 간결하게 표현하기 위해 사용되었다.


표기법

프로그래밍 언어에서는 8진수를 나타내기 위해 다양한 접두어를 사용한다. 일반적으로 숫자 앞에 0 또는 0o를 붙여 해당 숫자가 8진수임을 명시한다.

  • 예시:
    • C, C++, Java 등의 언어에서는 숫자 앞에 0을 붙인다. 012는 8진수 12를 의미하며, 이는 10진수 10에 해당한다.
    • 파이썬(Python)에서는 0o 접두어를 사용하여 0o12와 같이 명시적으로 표현할 수 있다.

10진법과의 관계 및 변환

8진수를 10진수로 변환

각 자리의 숫자에 8의 해당 거듭제곱을 곱하여 모두 더한다.

  • 예시: 8진수 $37_8$ $37_8 = (3 \times 8^1) + (7 \times 8^0)$ $= (3 \times 8) + (7 \times 1)$ $= 24 + 7 = 31_{10}$

10진수를 8진수로 변환

10진수를 8로 계속 나누고, 각 나눗셈의 나머지를 역순으로 취한다.

  • 예시: 10진수 $31_{10}$
    1. $31 \div 8 = 3$ 나머지 $7$
    2. $3 \div 8 = 0$ 나머지 $3$ 나머지를 역순으로 읽으면 $37_8$이 된다. 따라서 $31_{10} = 37_8$

2진법과의 관계 및 변환

8진법이 컴퓨터 과학에서 유용했던 가장 큰 이유는 2진법과의 쉬운 변환 때문이다. 하나의 8진수 숫자는 정확히 세 개의 2진수 숫자로 표현될 수 있다 ($2^3 = 8$). 이 특성 덕분에 긴 2진수를 더 짧고 읽기 쉬운 형태로 요약할 수 있었다.

8진수를 2진수로 변환

각 8진수 숫자를 세 자리 2진수로 변환하여 나열한다.

  • 예시: 8진수 $37_8$
    • $3_8$은 $011_2$
    • $7_8$은 $111_2$ 따라서 $37_8 = 011111_2$

2진수를 8진수로 변환

2진수를 오른쪽부터 세 자리씩 묶어 각 묶음을 8진수 숫자로 변환한다. (가장 왼쪽 묶음이 세 자리가 안 되면 0으로 채운다.)

  • 예시: 2진수 $011111_2$
    1. 오른쪽부터 세 자리씩 묶는다: $(011)_2 (111)_2$
    2. 각 묶음을 8진수로 변환한다:
      • $(011)_2 = 3_8$
      • $(111)_2 = 7_8$ 따라서 $011111_2 = 37_8$

활용

  • 초기 컴퓨터 시스템: 초기 컴퓨터 시스템, 특히 미니컴퓨터(예: PDP-8)에서 메모리 주소나 기계어 코드를 간결하게 표현하는 데 널리 사용되었다. 당시 컴퓨터는 8비트 바이트가 아닌 6비트, 12비트, 18비트 등의 워드 단위를 사용하는 경우가 많았는데, 이들은 3의 배수였기 때문에 8진법이 효율적이었다.
  • 파일 권한 설정: 유닉스(Unix) 및 리눅스(Linux) 운영체제에서 파일 및 디렉터리 권한(읽기(r), 쓰기(w), 실행(x))을 설정하는 chmod 명령어에 8진수가 사용된다. 예를 들어, chmod 755 filename은 파일 소유자에게는 모든 권한(4+2+1=7), 그룹 및 기타 사용자에게는 읽기 및 실행 권한(4+1=5)을 부여한다.
  • 현대 프로그래밍: 현재는 16진법이 더 보편적으로 사용되지만, 일부 임베디드 시스템, 저수준 프로그래밍, 특정 네트워크 프로토콜 등에서 8진법이 나타나기도 한다.

같이 보기

  • 2진법
  • 10진법
  • 16진법
  • 기수법
둘러보기

더 찾아볼 만한 주제