최근 수정 시각 : 2022-03-19 21:48:11

8진법

연산
Numbers and Operations
{{{#!wiki style="word-break: keep-all; margin:0 -10px -5px"
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin:-6px -1px -11px; letter-spacing: -1px"
<colbgcolor=#765432> 수 체계 자연수 ( 홀수 · 짝수 · 소수 · 합성수 ) · 정수 · 유리수 ( 정수가 아닌 유리수 ) · 실수 ( 무리수 · 초월수 ) · 복소수 ( 허수 ) · 사원수
표현 숫자 ( 아라비아 숫자 · 로마 숫자 · 그리스 숫자 ) · 수식 · 기수법 · 진법 ( 십진법 · 이진법 · 8진법 · 12진법 · 16진법 · 60진법 ) · 분수 ( 분모 · 분자 · 기약분수 · 번분수 · 연분수 · 통분 · 약분 ) · 소수 ( 유한소수 · 무한소수 ( 순환소수 · 비순환소수 ) ) · 환원 불능 · 미지수 · 변수 · 상수
연산 사칙연산 ( 덧셈 · 뺄셈 · 곱셈 구구단 · 나눗셈 ) · 역수 · 절댓값 · 제곱근 ( 이중근호 ) · 거듭제곱 · 로그 ( 상용로그 · 자연로그 ) · 검산 · 교환자
방식 암산 · 세로셈법 · 주판 · 산가지 · 네이피어 계산봉 · 계산기 · 계산자
용어 이항연산 · 항등원과 역원 · 교환법칙 · 결합법칙 · 분배법칙
기타 수에 관련된 사항 ( 0과 1 사이의 수 · 음수 ) · 혼합 계산 ( 48÷2(9+3) · 111+1×2=224 · 2+2×2 ) · 0으로 나누기 · 0의 0제곱 }}}}}}}}}

진법
2진법 8진법 10진법
12진법 16진법 60진법

1. 개요2. 표현법3. 사용처4. 여담

1. 개요

/ octal
컴퓨터 분야에서 숫자를 표현하기 위해 쓰는 진법 방식. 외국에선 줄여서 Oct 라고도 부른다.

공돌이들이 크리스마스( 12월 25일)와 할로윈( 10월 31일)을 헷갈려 한다는 공대개그가 있다. 12월 25일은 Dec 25인데 Dec는 10진법을 뜻하고, 10월 31일은 Oct 31인데 Oct는 8진법을 의미하며 8진법으로 31은 10진법의 25와 같기 때문.[1]

컴퓨터를 포함한 전자기기 분야를 깊게 파고드는 사람이라면 모를 수가 없는 표현방식이다. 다른 진수는 'base N'으로 쓰더라도 2진수, 8진수, 10진수, 16진수 4개는 꼬박꼬박 전용 표현(binary, octal, decimal, hexadecimal)을 써 준다. 8진수, 16진수는 2진수의 가독성 향상을 위한 툴이므로 2진수와 다를 게 없다. 따라서 사실상 2개다.

2. 표현법

자릿수 하나가 0부터 7까지 표현할 수 있다. 8부터는 10, 9는 11, 10은 12...하는 식으로 표기한다. 따라서 별도로 표기하지 않으면 10진법과 잘 구분이 안 된다. 컴퓨터 초창기에 많이 썼는데 점차 안 쓰게 된 이유가 이것이다. 그레이스 호퍼는 젊은 시절 자꾸 세금 계산이 틀려서 왜 그런가 봤더니 10진법 대신 자기도 모르게 익숙한 8진법을 썼기 때문이었다는 일화도 있다. 알파벳 기호가 들어가서 직관적으로 알 수 있는 16진법에 비해 쓰기 불편하다.

보통 숫자 뒤에 (8) 또는 알파벳 o를 붙여서 표시한다. 혼란을 막기 위해 1=l, 2=s, 3=n, 4=m, 5=t, 6=f, 7=u, 0=o 하는 식으로 알파벳으로 표기하는 방법도 있다. 물론 보면 알다시피 숫자보다 더 불편하니 쓰는 사람이 없다.

8진법을 컴퓨터 분야에서 쓰는 이유는 8진수 자릿수 하나가 23을 표현할 수 있어서 2진수를 직관적으로 빠르게 변환 가능하고, 16진수에 비해 사람이 계산하기 간편하기 때문이다. 이는 프로그래밍할 때 사람이 비트까지 고려해야 했던 초창기 컴퓨터에선 긴요했다. 다만 자릿수 하나가 1 바이트에 정확히 대응하지 않기에 이후 주된 숫자 표현법을 16진법에 물려주게 된다.
  • 8진법을 2진법으로 바로 변환하려면 각 자릿수를 2진법으로 변환하면 된다.
    예를 들면 7148은 111(7) 001(1) 100(4)처럼 끊어서 변환한 다음 전부 붙여주고 앞의 0을 떼준 뒤 1110011002로 적으면 된다.
  • 반대로 2진법을 8진법으로 바로 변환하려면 1의 자리에서부터 3개씩 끊어서 8진법으로 변환해주면 된다.
    101111010112를 (0)10 111 101 011로 끊어주고 각각 변환하면 27538이 된다.

3. 사용처

요즘은 컴퓨터공학과 교육과정 외엔 거의 안 쓰인다. 간혹가다 코어한 개발자들이 에디터 프로그램에 변환기능을 넣는 경우도 있다.

윈도우 기본제공 계산기에도 8진수 변환 기능이 있다. XP 이전의 옛 계산기엔 공학용 기능에 통합되어 있지만 비스타 이후 계산기부터는 프로그래머용 계산기로 따로 분화되어 나왔다.

UNIX의 파일 액세스 권한 설정을 8진법으로 표기한다. 유닉스의 파일 액세스 권한은 소유자, 그룹, 외부인 각각에 대해 읽기, 쓰기, 실행 권한을 지정할 수 있는데 읽기, 쓰기, 실행 권한 3비트를 8진수 하나로 묶어서 표기한다. 예를 들어 권한 751은 rwxr-x--x 를 뜻하는데 파일 소유자는 읽기, 쓰기, 실행 권한 모두를 갖고 파일의 그룹 구성원에겐 읽기와 실행, 그 외의 사용자에겐 실행 권한만을 준다는 의미이다.

4. 여담

C언어에선 8진수 표기를 숫자 앞에 0(숫자 0)을 붙이는 걸로 정했다. 그래서 C언어에선 숫자의 자릿수를 맞추려고 0이란 패딩값을 못 쓴다.
#!syntax cpp
int a = 12345;
int b = 01234;

이걸 사람은 당연히 b값을 1234라고 생각하지만, 컴파일러는 저걸 8진수로 해석해서 10진수 668[2]이란 값을 변수에 할당한다. C언어를 쓸 때 조심해야 하는 부분 중 하나.

특히 이런 경우엔 정말 못 알아본다.
#!syntax cpp
#include <stdio.h>
int main(void)
{
  int a[3] = {001, 010, 100};
  printf("%d %d %d", a[0], a[1], a[2]);
  return 0;
}

8진법에서는 7의 배수를 구하기 쉽다. 8진법에서 각 자릿수의 합이 7의 배수이면 그 수는 7의 배수이다. 10진법에서의 9의 배수 판정법, n진법에서의 (n-1)의 배수 판정법과 같은 원리.


[1] Oct는 10월(October), Dec는 12월의 준말이기도 한데, 각각 숫자 8과 10이라는 어원과 완전히 관련없는 것은 아니다. 율리우스 카이사르 아우구스투스가 자기 이름을 달에 넣음으로써(July, August) 9월(September, 그말인즉슨 이것도 원래는 7번째 달이었다는 뜻이다.)부터 두 달씩 밀리게 되면서 생긴 사례 [2] 1*83+2*82+3*81+4*80=512+128+24+4=668

분류