DuckingRacoon
[C++] size_t는 unsigned 타입이다. 본문
서론: 문제 발견 상황
알고리즘 문제를 풀다가 다음과 같은 문제가 생겼다.
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
+더보기