오버플로우(overflow)의 의미
- 각 데이터타입은 자료형에 맞는 저장의 최대/최소 범위가 존재한다. int number; 라고 선언하자. number는 변수의 이름이며 그 앞에 있는 int는 변수의 타입이다. int형 자료형은 4바이트의 정수형 타입으로 음수를 고려하고 있기 때문에 number가 저장할 수 있는 최대값은 2의31승-1이고, 이 값은 곧 2147483647 이다. (약 21억) 따라서 number 변수에는 약 21억까지 저장이 가능하다. 그런데 만일 코드에서 number 변수에 저 최대 숫자 이상을 넣는다면 어떻게 될까? 이와 같이 저장할 수 있는 최대범위를 넘어설때 이를 "오버플로우(overflow)" 라고 부른다.
오버플로우(overflow)의 법칙
- number의 최대저장가능값은 2147483647 인데 여기에 1을 더해서, 2147483648을 number에 저장하면 오버플로우가 발생한다. 이때 실제로 저장해놓고 printf를 이용해 number변수를 출력해보면 그 값은 "-2147483648 "이 들어가 있다. 이것은 오버플로우의 법칙때문에 발생한다. 어떻게 이렇게 되는 것인지는 아래 그림을 보면 좀더 이해가 쉽다.
윗그림은 int의 모든 범위를 나타낸다. 가장 오른쪽에 있는 숫자가 바로 2147483647 이다. 여기에 1을 더하게 되면 오버플로우가 발생하고, 이때 저장되는 값은 가장 우측 동그라미에서 한칸 가야하는데 가야할곳이 없기 때문에 다시 처음으로 돌아오게 된다. 그렇다. 이것이 오버플로우의 법칙이다. unsigned int 의경우 음수를 고려하지 않기 때문에 4294967295 가 가장 큰 값이다. 여기에 1을 더하게 되면 오버플로우가 발생하고 한칸을 더가게되면 0의 값을 갖는다. 만약 4294967295 에 2를 더하게 되면 2칸을 더 가야하므로 저장되는 값은 1이다. 즉 얼마를 더 더하든지 저 순환 고리는 무한으로 동작해서 제자리를 찾게 된다.
* 이해했는지, 간단한 예를 다시 들어보자. char 형은 -128 ~ 127 까지 저장이 가능하다.
char C; 라고 선언한뒤, C = 231 을 넣고 이값을 printf("%d", C); 와 같이 출력하면 화면에는 얼마가 출력될까?
정답 -> C가 가질수 있는 최대값은 우선 127이다. 그런데 231을 넣었으므로 231-127 = 104칸을 더 간 것이다. 1칸을 더 가면 -128이다. 104칸을 더 갔으므로, -128 + 104 - 1 = -25 가 된다.
출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sharonichoya&logNo=220340284388
'CS > 공통' 카테고리의 다른 글
깃(Git) 한글 깨짐 현상 해결 (0) | 2023.06.11 |
---|---|
Visual Studio 한글 사용 시 오류 발생 (0) | 2023.06.11 |
프로젝트의 총 코드 라인 수를 확인하는 방법 (SourceMonitor) (0) | 2022.09.06 |
64bit OS에서 C++과 C# 데이터 차이 비교 (0) | 2022.08.09 |
비쥬얼 스튜디오 프로젝트명 변경하는 방법 (0) | 2022.06.30 |