Knowledge/C++

comparison between signed and unsigned integer expressions 원인 및 해결 방법

TakeKnowledge 2019. 7. 16. 14:07
반응형
 

C++ sizeof() 함수와 strlen()의 차이

BOJ 8958번 문제 ( https://www.acmicpc.net/problem/8958 ) 를 풀면서 알게된 것 먼저 이 개념을 확실히 해야한다. sizeof() - 실제로 차지하고 있는 메모리의 크기를 구한다. strlen() - 문자열의 길이를 구한다..

takeknowledge.tistory.com

이 역시 위 포스팅과 같이 BOJ 8958번 문제 ( https://www.acmicpc.net/problem/8958 ) 를 풀면서 알게된 것

 

strlen()을 활용해 문제 풀고 맞았습니다 판정까지 받았지만 

1
2
3
4
Main.cc: In function ‘int main()’:
Main.cc:19:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j=0; j<strlen(cArr); j++){
                ~^~~~~~~~~~~~~
cs

위와 같은 경고문이 코드 아래에 붙어있었다. 

 

찾아보니 이는 부호 있는 정수와 부호 없는 정수를 비교할 때 발생하는 경고문이고 

int는 기본적으로 signed int (부호 있는 정수)인데 strlen()이 리턴하는 값은 unsigned int(부호 없는 정수)이기에

둘을 비교하는 부분에서 해당 에러가 발생한 것이다.

 

해결법은 간단히 캐스팅을 해주면된다

 

- signed int를 unsigned int로 바꾸려면 

signed int 앞에 (unsigned int)를 붙이면 된다. 위 코드로 에를 들자면

 

(unsigned int)j < strlen(cArr) 하면 해결

 

- unsigned int를 signed int로 바꾸려면

unsigned int 앞에 (int)를 붙이면 된다. 위에서도 적었듯 int는 기본적으로 signed int이기 때문. 이 역시 위 코드로 보면

 

j < (int)strlen(cArr) 하면 해결

 

아무튼 그렇다. 나는 아래 방법으로 수정해서 깔끔한 AC 획득!

 

참조 

 

C 언어] signed int 를, unsigned int 로 상호 변환, 캐스팅

C에서는 내부적으로 unsigned 형을 잘 지원하기에, 별도의 함수를 만들지 않고도, signed형과 unsigned형을 상호 변환할 수 있습니다. 예를 들어 변수명이나 숫자 앞에 (unsigned int) 이런 "캐스트 연산자"를 붙여 주면 unsigned int형으로 변환됩니다. signed int, unsigned int 상호 변환 예제 소스 소스 파일명: example.cpp #include int main(void) {   /

mwultong.blogspot.com

 

반응형