ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1074) N
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (183)
      • Unreal (69)
      • Unity (103)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (349) N
      • C++ (168) N
      • C# (90)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (10)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 알고리즘
  • 백준
  • SQL
  • 유니티
  • 프로그래머스
  • C
  • 문자열
  • c#
  • 포인터
  • 클래스
  • 함수
  • 그래픽스
  • C++
  • 배열
  • 오블완
  • 티스토리챌린지
  • 언리얼
  • 파이썬
  • string
  • Unity

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

Overflow (오버플로우)
CS/공통

Overflow (오버플로우)

2022. 10. 22. 19:35

오버플로우(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
    'CS/공통' 카테고리의 다른 글
    • 깃(Git) 한글 깨짐 현상 해결
    • Visual Studio 한글 사용 시 오류 발생
    • 프로젝트의 총 코드 라인 수를 확인하는 방법 (SourceMonitor)
    • 64bit OS에서 C++과 C# 데이터 차이 비교
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바