수와 연산 Numbers and Operations | |||
{{{#!wiki style="margin: 0 -10px -5px; min-height: calc(1.5em + 5px)" {{{#!folding [ 펼치기 · 접기 ] {{{#!wiki style="margin: -5px -1px -11px" | <colbgcolor=#765432> 수 체계 | 자연수 (홀수 · 짝수 · 소수 · 합성수) · 정수 · 유리수 (정수가 아닌 유리수) · 실수 (무리수 · 초월수) · 복소수 (허수) · 사원수 | |
표현 | 숫자 (아라비아 숫자 · 로마 숫자 · 그리스 숫자) · 기수법(과학적 기수법 · E 표기법 · 커누스 윗화살표 표기법 · 콘웨이 연쇄 화살표 표기법 ·BEAF· 버드 표기법) · 진법 (십진법 · 이진법 · 8진법 · 12진법 · 16진법 · 60진법) · 분수 (분모 · 분자 · 기약분수 · 번분수 · 연분수 · 통분 · 약분) · 소수 {유한소수 · 무한소수 (순환소수 · 비순환소수)} · 환원 불능 · 미지수 · 변수 · 상수 | ||
연산 | 사칙연산 (덧셈 · 뺄셈 · 곱셈 구구단 · 나눗셈) · 역수 · 절댓값 · 제곱근 (이중근호) · 거듭제곱 · 로그 (상용로그 · 자연로그 · 이진로그) · 검산 · 연산자 · 교환자 | ||
방식 | 암산 · 세로셈법 · 주판 · 산가지 · 네이피어 계산봉 · 계산기 · 계산자 | ||
용어 | 이항연산(표기법) · 항등원과 역원 · 교환법칙 · 결합법칙 · 분배법칙 | ||
기타 | 수에 관련된 사항 (0과 1 사이의 수 · 음수 · 작은 수 · 큰 수) · 혼합 계산 (48÷2(9+3) · 111+1×2=224 · 2+2×2) · 0으로 나누기(바퀴 이론) · 0의 0제곱 | }}}}}}}}} |
진법 Base N | |||||
2진법 | 8진법 | 10진법 | 12진법 | 16진법 | 60진법 |
1. 개요
八進法 / octal숫자를 표현하기 위해 쓰는 진법 방식. 외국에선 줄여서 Oct라고도 부른다.
컴퓨터를 포함한 전자 기기 분야를 깊게 파고드는 사람이라면 모를 수가 없는 표현 방식이다. 다른 진수는 'base N'으로 쓰더라도 2진수, 8진수, 10진수, 16진수 4개는 꼬박꼬박 전용 표현(binary, octal, decimal, hexadecimal)을 써 준다. 8진수, 16진수는 2진수의 가독성 향상을 위한 툴이므로 2진수와 다를 게 없다. 따라서 사실상 2개다.
물론 컴퓨터 분야에서만 쓰이는 것은 아니며 일상 언어에서 8진법을 사용하는 곳도 있었다.
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. 사용처
3.1. 컴퓨터공학과
간혹가다 코어한 개발자들이 에디터 프로그램에 변환 기능을 넣는 경우도 있다.윈도우 기본 제공 계산기에도 8진수 변환 기능이 있다. XP 이전의 옛 계산기엔 공학용 기능에 통합되어 있지만 비스타 이후 계산기부터는 프로그래머용 계산기로 따로 분화되어 나왔다.
UNIX의 파일 액세스 권한 설정을 8진법으로 표기한다. 유닉스의 파일 액세스 권한은 소유자, 그룹, 외부인 각각에 대해 읽기, 쓰기, 실행 권한을 지정할 수 있는데 읽기, 쓰기, 실행 권한 3비트를 8진수 하나로 묶어서 표기한다. 예를 들어 권한 751은 rwxr-x--x 를 뜻하는데 파일 소유자는 읽기, 쓰기, 실행 권한 모두를 갖고 파일의 그룹 구성원에겐 읽기와 실행, 그 외의 사용자에겐 실행 권한만을 준다는 의미이다.
3.2. 유키족
아메리카 원주민 중 캘리포니아 지역에 살던 유키 족은 특이하게도 8진법을 사용한다.거의 대부분의 언어에서 손가락 갯수에 맞춰 10진법을 사용하는 것과 비교하면 상당히 특이한데, 이에 대해 유키족은 '손가락 사이의 벌린 틈'을 이용해서 숫자를 셌다는 것이 정설이다.
그러나 유키족 언어는 1983년 마지막 구사자가 사망하며 소멸되었고 현재 살아있는 500여 명의 유키족은 유키 언어를 구사하지 못하기에 현재 지구상에 일상 언어로 8진법을 쓰는 곳은 없다.
만일 유키족이 문명을 발전시켜 현대까지 살아남았다면 컴퓨터 공학에 특출난 민족이 되었을 수도 있을 것이다.
4. 여담
C에선 8진수 표기를 숫자 앞에 0(숫자 0)을 붙이는 걸로 정했다. 그래서 C언어에선 숫자의 자릿수를 맞추려고 0이란 패딩값을 못 쓴다.#!syntax cpp
int a = 12345;
int b = 01234;
이걸 사람은 당연히 b값을 1234라고 생각하지만, 컴파일러는 저걸 8진수로 해석해서 10진수 668[1]이란 값을 변수에 할당한다. 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)의 배수 판정법과 같은 원리.
공돌이들이 크리스마스(12월 25일)와 할로윈(10월 31일)을 헷갈려 한다는 공대개그가 있다. 12월 25일은 Dec 25인데 Dec는 10진법을 뜻하고, 10월 31일은 Oct 31인데 Oct는 8진법을 의미하며 8진법으로 31은 10진법의 25와 같기 때문.[2]
아바타 시리즈에 등장하는 외계인 나비는 손가락이 한 손에 4개씩 8개이며 따라서 자연스럽게 8진법을 사용한다고 설정되어 있다.
[1] 1*83+2*82+3*81+4*80=512+128+24+4=668[2] Oct는 10월(October), Dec는 12월의 준말이기도 한데, 각각 숫자 8과 10이라는 어원과 완전히 관련 없는 것은 아니다. 과거 로마 달력은 1년에 10개월이었는데, 이후 January와 Febuary가 추가되면서 12개월이 되면서 실제 어원보다 두 달 뒤로 밀린 것이다.