8진법

최근 수정 시각: (5년 전)
목차
1. 개요2. 표현법3. 사용처4. 여담

1. 개요 [편집]

Octal

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

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

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

2. 표현법 [편집]

자릿수 하나가 0부터 7까지 표현할 수 있다. 따라서 별도로 표기하지 않으면 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이란 패딩값을 못 쓴다.
int a = 12345;
int b = 01234;

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

특히 이런 경우엔 정말 못 알아본다.
#include <stdio.h>
int main(void)
{
  int a[3] = {001, 010, 100};
  printf("%d %d %d", a[0], a[1], a[2]);
  return 0;
}
[1] Oct는 10월(October)의 준말이기도 한데, 숫자 8이라는 어원과 완전히 관련없는 것은 아니다. 10월이 원래는 8번째 달이었는데, 율리우스 카이사르아우구스투스가 자기 이름을 달에 넣음으로써(July, August) 9월(September, 그말인즉슨 이것도 원래는 7번째 달이었다는 뜻이다.)부터 두 달씩 밀리게 되었다.[2] 1*83+2*82+3*81+4*80=512+128+24+4=668

라이선스를 별도로 명시하지 않은 문서는 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다.
기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다.

문서의 기여자는 역사 탭에서 확인할 수 있습니다.
접두어의 N: - 나무위키 사용자, R: - 리그베다 위키의 사용자를 뜻합니다.
자세한 사항은 나무위키에서 동일한 문서의 역사를 참고하시기 바랍니다.