본문 바로가기
Language/C++

int 변수의 앞자리가 0인 경우, 0123 = 83 ? Int prefix

by W00gie 2021. 2. 3.

최근 STL을 공부하며 연산자 오버로딩, 벡터등의 시퀀스 컨테이너를 지나 연관 컨테이너의 map부분을 공부하고 있다.

공부할 때 잡다한 코드들을 책 안보고 작성해보면서 문법에 익숙해지려 노력하는 편인데 의외의 오류가 발생해 적어놓는다.

#include <iostream>
#include <map>

using namespace std;

struct timetable
{
	int time= 0123;
	int name= 23232;
}q,w,e,r,t;

int main()
{
	map<int, timetable>m ;

	m.insert(pair<int, timetable>(5, q));
	m.insert(pair<int, timetable>(3, w));
	m.insert(pair<int, timetable>(2, e));
	m.insert(pair<int, timetable>(4, r));


	map<int, timetable>::iterator iter;
	for (iter = m.begin(); iter != m.end(); ++iter)
	{
		cout << "(" << (*iter).first << ',' << (*iter).second.time << ")" << " ";
	}
	cout << endl;


	return 0;
}

당시 나의 출력 기대값은 (2,123)

map 컨테이너 안에 사전에 초기화 되어있는 timetable이라는 구조체를 insert 하고 출력해보는 직접 작성한 코드이다.

time 변수를 0123으로 초기화한건 그냥 단순히 '아무 값이나 넣어보자' 라는 의도에서 적었지만 출력결과를 보자 전혀 다른 값이 나와 여러가지 이유를 찾아보려했다.

 

멀리 찾아 혜맬 필요 없이 내가 실수했던 케이스(0123 83)만 구글에 검색해도 나와 똑같은 경우가 나오더라

따로 2진수 16진수 등을 의도해 int 변수 설정을 한 경험이 없어 몰랐지만 int 변수는 컴파일 시 값의 앞자리를 따서 해당 변수의 진수를 판별한다고한다. 이를 prefix라 칭한다. 이는 C++를 넘어 C언어에서부터 사용된 기능인데, 0x나 0X(zero-ex)는 16진수의 값을, 0의 prefix는 8진수의 값을 지정하는 데 사용된다.

 

예를 들어, 내가 실수한 0123의 경우 8진수로 계산되어 83의 value를 가진 int 변수가 할당 된 것이다.

 혹여 다음에 bit단위의 연산이 필요하다면 편리할 것 같다