컴퓨터 시스템에서 8진수(octal number)는 밑이 8인 8진법으로 표현되고, 10진수(decimal number)는 우리가 일상적으로 사용하는 밑이 10인 10진법으로 표현됩니다. 두 진법 사이의 변환은 프로그래밍에서 자주 마주치는 기본 개념 중 하나입니다.
아래 표는 대표적인 10진수와 이에 대응하는 8진수의 예시입니다.
| 10진수 | 8진수 |
|---|---|
| 10 | 12 |
| 70 | 106 |
| 25 | 31 |
| 16 | 20 |
8진수를 10진수로 변환하고, 반대로 10진수를 8진수로 변환하는 C++ 프로그램은 다음과 같습니다.
예제 코드
#include <iostream>
#include <cmath>
using namespace std;
void DecimalToOctal(int decimalNum) {
int octalNum = 0, placeValue = 1;
int dNo = decimalNum;
while (decimalNum != 0) {
octalNum += (decimalNum % 8) * placeValue;
decimalNum /= 8;
placeValue *= 10;
}
cout<<"Octal form of decimal number "<<dNo<<" is "<<octalNum<<endl;
}
void OctalToDecimal(int octalNum) {
int decimalNum = 0, power = 0;
int oNo = octalNum;
while(octalNum != 0) {
decimalNum += (octalNum%10) * pow(8,power);
++power;
octalNum/=10;
}
cout<<"Decimal form of octal number "<<oNo<<" is "<<decimalNum<<endl;
}
int main() {
DecimalToOctal(20);
OctalToDecimal(32);
return 0;
}
실행 결과
Octal form of decimal number 20 is 24 Decimal form of octal number 32 is 26
프로그램 구조 살펴보기
위 프로그램은 두 개의 핵심 함수로 구성되어 있습니다. DecimalToOctal 함수는 10진수를 8진수로 변환하고, OctalToDecimal 함수는 8진수를 10진수로 변환합니다.
1. 10진수 → 8진수 변환 (DecimalToOctal)
함수가 시작되면 먼저 octalNum 변수가 0으로 초기화됩니다. placeValue 변수는 결과 숫자에서 각 자릿수가 위치할 자리를 나타내며, while 루프를 통해 최종 8진수 값이 계산됩니다.
루프가 한 번 반복될 때마다 다음 작업이 수행됩니다.
decimalNum을 8로 나눈 나머지에placeValue를 곱하여 기존octalNum에 더합니다.decimalNum을 8로 나눈 몫을 다시 저장합니다.placeValue는 10배씩 곱해져 다음 자릿수로 이동합니다.
이 과정을 보여주는 코드 조각은 다음과 같습니다.
while (decimalNum != 0) {
octalNum += (decimalNum % 8) * placeValue;
decimalNum /= 8;
placeValue *= 10;
}
최종적으로 8진수 값인 octalNum이 구해지면 화면에 출력됩니다.
cout<<"Octal form of decimal number "<<dNo<<" is "<<octalNum<<endl;
2. 8진수 → 10진수 변환 (OctalToDecimal)
이 함수에서는 while 루프가 반복될 때마다 octalNum을 10으로 나눈 나머지(즉, 가장 오른쪽 자릿수)에 8의 거듭제곱을 곱한 값을 기존 decimalNum에 더합니다. 이후 power를 1만큼 증가시키고 octalNum을 10으로 나누어 다음 자릿수를 처리합니다. 이 과정은 다음과 같습니다.
while(octalNum != 0) {
decimalNum += (octalNum%10) * pow(8,power);
++power;
octalNum/=10;
}
decimalNum의 값이 모두 계산되면 아래처럼 출력됩니다.
cout<<"Decimal form of octal number "<<oNo<<" is "<<decimalNum<<endl;
main() 함수의 역할
main() 함수에는 변환할 값과 함께 DecimalToOctal()과 OctalToDecimal() 함수를 호출하는 코드만 포함되어 있습니다.
DecimalToOctal(20); OctalToDecimal(32);
이처럼 나머지 연산과 거듭제곱 연산만 활용하면 별도의 라이브러리 없이도 두 진법 간 변환을 손쉽게 구현할 수 있습니다. 진법 변환의 기본 원리를 이해하고 있다면 2진수, 16진수 등 다른 진법으로의 확장도 어렵지 않게 응용할 수 있습니다.