2023.1.5. 최초 작성
C언어에서 int는 4byte 기준으로 생각하면 저장할 수 있는 정수의 범위는 –2147483648 ~ 2147483647이다.
그렇다면 아래 코드에서 int 변수에 양수의 가장 큰 값인 2147483647을 넣고 1을 증가하면 어떻게 되는지 확인해보았다.
#include <stdio.h>
void main() {
int n = 2147483647;
printf("%d\n", n);
n++;
printf("%d\n", n);
}
[실행 결과]
2147483647
-2147483648
이렇게 정수의 표현범위를 넘친 것이 정수 오버플로우이다.
이런 일이 일어나는 이유는 컴퓨터가 뺄셈을 위해 음수를 표현하는 방식 때문이다.
signed int는 양수뿐 아니라 음수 정보도 필요하다. 컴퓨터가 음수를 표현하는 방법은 대표적으로 세 가지 방법이 있다.
부호화절대치 방법, 1의 보수 방법, 2의 보수 방법이다.
부호화절대치 방법은 맨 왼쪽의 비트를 음수 부호 비트로 활용하는 것이다. 맨 왼쪽 비트가 0이면 양수, 1이면 음수로 구분한다.
1의 보수 방법은 양수 값의 비트 정보를 모두 반대로 바꾸는 NOT 논리연산 한 값을 음수로 표현하는 방법이다.
2의 보수 방법은 1의 보수에 더하기 1을 하는 방법이다.
세 가지 방법 다 장단점이 있는데 컴퓨터는 주로 2의 보수 방법을 이용한 뺄셈 연산을 채용하고 있다.
int의 가장 큰 값과 가장 작을 2진수로 나타내면 아래와 같다.
int자료형 | 10진수 | 16진수 | 2진수 |
최소 값 | -2147483648 | 0x80000000 | 1000 0000 0000 0000 0000 0000 0000 0000 |
최대 값 | 2147483647 | 0x7FFFFFFF | 0111 1111 1111 1111 1111 1111 1111 1111 |
16진수와 2진수로 비교해보면 최대 값에 1을 더한 것이 최소 값인 것을 확인할 수 있다.
컴퓨터에서 수 표현의 내용은 아래의 나무 위키에 자세히 나와있다.
https://namu.wiki/w/%EC%BB%B4%ED%93%A8%ED%84%B0%EC%97%90%EC%84%9C%EC%9D%98%20%EC%88%98%20%ED%91%9C%ED%98%84
컴퓨터에서의 수 표현 - 나무위키
일반적으로 컴퓨터에서 사용되는 정수형의 종류는 다음과 같다. 형크기char8비트short16비트int32비트long64비트 각 정수는 음수를 표현할 수 없고 양수 크기가 두 배로 지원되는 unsigned 형을 가진다.
namu.wiki
정수를 기억하는 변수의 크기를 넘치게 되면 정수 오버플로우 발생해 데이터가 변조된다.
수를 계산할 때 이렇게 변조된 값을 가지고 계산을 하게 되면 이상한 결과를 도출하게 되는 문제가 일어나는데 아리안5 로켓이 이런 문제로 폭발하였다고 한다.
https://ko.wikipedia.org/wiki/%EC%95%84%EB%A6%AC%EC%95%88_5
아리안 5 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 아리안 5Ariane 5 일반 정보 아리안 5의 모형 용도 위성 발사체 제작자 EADS 아스트리움 사용국 유럽 제원 전장 59 m 직경 5.4 m 중량 777,000 kg 운반궤도 LEO, GTO 단수 2
ko.wikipedia.org
'프로그래밍 > C' 카테고리의 다른 글
외부 변수(extern)와 헤더파일 만들기 (0) | 2023.01.05 |
---|---|
레지스터 변수 (0) | 2023.01.05 |
C언어 전역변수와 지역변수의 블록 범위 (0) | 2023.01.05 |
C언어 반복문 흐름제어(break, continue, return) (0) | 2023.01.05 |
C언어 반복문(while, do-while, for) (0) | 2023.01.03 |