char 오버플로 이해

  • 3 minutes to read

char 데이터 타입과 오버플로 문제 해석하기

이 글에서는 char 데이터 타입의 범위를 초과하는 값인 200을 할당했을 때의 예상 출력과 발생하는 문제점을 분석하고, 개선 방안을 제시하겠습니다.

코드 분석

다음은 C 프로그래밍 언어로 작성된 코드입니다:

void main(void)
{
   char c = 200;
   printf("%d", c);
}

예상 출력

  • char 타입은 보통 1바이트(256가지 값)를 사용하며, 부호 있는 char의 경우 -128에서 127까지의 범위를 가집니다. char c = 200;은 이 범위를 초과하기 때문에 오버플로우가 발생합니다.
  • 200을 이진수로 표현하면 11001000입니다. 이것을 부호 있는 8비트 char로 해석하면, 최상위 비트가 부호 비트이므로 음수로 처리됩니다. 이진수 11001000의 2의 보수 값은 -56입니다.

따라서, 이 코드는 -56을 출력할 것으로 예상됩니다.

문제점

  1. 자료형 범위 초과: char로 표현할 수 있는 범위를 넘어서는 값을 할당함으로써 발생하는 오버플로 문제입니다.
  2. 표준 준수 문제: main 함수는 표준 C에서 int 타입을 반환해야 합니다. void main(void)는 일부 컴파일러에서는 허용되지만 표준에서는 권장하지 않습니다.

개선 방안

  • 부호 없는 unsigned char을 사용하면 0에서 255까지의 값을 문제없이 처리할 수 있습니다. 따라서 unsigned char을 사용하면 200이라는 값도 안정적으로 처리됩니다.
  • main 함수의 반환 타입을 int로 변경하고, 프로그램 종료 시 return 0;을 추가하여 C 표준을 준수하도록 합니다.

개선된 코드 예:

int main(void)
{
   unsigned char c = 200;
   printf("%d", c);
   return 0;
}

이 코드는 200을 출력하며 C의 표준을 잘 준수합니다.

결론

charunsigned char의 차이를 이해하고 적절히 사용하는 것은 C 프로그래밍에서 중요합니다. 부호 있는 char의 오버플로를 피하고, 더 넓은 범위의 값을 안전하게 처리하려면 unsigned char의 사용을 고려해야 합니다. 또한, 모든 C 프로그램은 표준에 따라 int main()을 사용하고, 명시적으로 return 값을 제공해야 합니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com