DuckingRacoon

[C++] size_t는 unsigned 타입이다. 본문

C++

[C++] size_t는 unsigned 타입이다.

따킹라쿤 2024. 5. 16. 09:40

서론: 문제 발견 상황

알고리즘 문제를 풀다가 다음과 같은 문제가 생겼다.

string sNum = to_string(Num);

for (int j = 0; j < sNum.length() - 2; j++)
{ // 숫자의 길이가 2 이하일 땐 진입하지 말아야하지만 진입함. }

 

위의 코드의 로직대로라면
Num이 한 자리수, 두 자리수 숫자일 때에는 루프에 진입하면 안된다.

 

하지만 루프에 진입한다!

 

반대로 위의 코드와 로직적으로 동일한 밑의 코드는 제대로 동작한다.

string sNum = to_string(Num);
int length = sNum.length();
for (int j = 0; j < length - 2; j++)
{ // 숫자의 길이가 2 이하일 땐 진입하지않음. }

 

왜일까?

Underflow 발생: size_t는 unsigned 타입이다.

그 이유는 sNum.length() - 2에서 underflow가 발생하기 때문이다.

 

string의 길이를 구하는 함수 length()는 size_t 타입 값을 반환한다.

 

size_t는 배열의 크기, 메모리와 같이 크기 값들에 사용되며
크기는 음수일 수 없기 때문에 size_t는 unsigned타입이다.

 

맨 위의 코드와 같이 size_t값을 음수로 내려버리면 underflow가 발생해버린다.

underflow로 인해 예상치 못한 동작이 발생할 수 있다.

 

그래서 위의 같은 코드를 우리 예상대로 사용하기 위해선 int로 변환해야한다.

int Num = 1;
string sNum = to_string(Num);

int l = sNum.length() - 2 ;

cout << sNum.length() - 2 << endl; // output: 18446744073709551615
cout << (int)sNum.length() - 2 << endl; // output: -1
cout << l << endl; // output: -1

 

+더보기