번개애비의 라이프스톼일
char에서 오버플로우 되는 연산의 결과 본문
char는 기본적으로 -128~127 내의 숫자만 담을 수 있는 그릇입니다.
자료형 | 키워드 | 메모리 크기 | 값의 범위 |
문자형 | char | 1 Bytes | -128~127 |
정수형 | short | 2 Bytes | -32,768~32,767 |
int | 4 Bytes | -2,147,483,648 ~ 2,147,438,647 | |
long | 4 Bytes | -2,147,483,648 ~2.147.483.647 | |
부호없는 문자형 | unsigned char | 1 Bytes | 0~255 |
부호없는 정수형 | unsigned short | 2 Bytes | 0~65,535 |
unsigned int | 4 Bytes | 0~4,294,967,295 | |
unsigned long | 4 Bytes | 0~4,294,967,295 | |
부동 소수형 | float | 4 Bytes | 1.2E-38~3.4E38 |
double | 8 Bytes | 2.2E-308~1.8E308 | |
void형 | void | 0 Bytes | 값 없음 |
해당하는 숫자안에서만 놀면 다행인데,
연산결과 값이 해당하는 숫자를 넘어설때 (이를 오버플로우라고 합니다.)
완전히 엉뚱한 값이 나옵니다.
하지만, 그 값을 어느정도 예측이 가능합니다.
다음은 char를 이용한 덧셈연산 C 프로그램입니다.
//변수들을 char이라고 선언합니다.
char a, b, c;
//a변수에 70을 담습니다.
a=70;
//b변수에 80을 담습니다.
b=80;
//연산한 내용을 c변수에 담습니다.
c=a+b;
//연산한 c변수를 출력합니다.
prinf("%d", c);
이렇게 연산하게 되면 통상적으로 70+80=150 이 되어야 합니다만,
앞서 말했다시피 char는 127까지의 숫자만을 담습니다.
위 코드를 직접 실행해보면 -106이라는 쌩뚱맞은 숫자가 나오게 되는데
이는 실제 결과값 150가 오버플로우가 되어서 127-150=-23만큼 오버가 됩니다.
-23은 char 범위에서 다시 뒤로 돌아와 -128에서 한계단씩 올라갑니다.
-128+23=-105
여기서 오버플로우가 되고 양에서 음으로 전환됬기 때문에
1만큼 한계단더 진행하면 -106가 됩니다.
실제 C실행 결과 : http://codepad.org/nsi3rqVb
'IT' 카테고리의 다른 글
안드로이드에서 플래시재생이 안될때 (0) | 2016.06.21 |
---|---|
Artificial Intelligence (0) | 2016.04.25 |
웹에서 프로그래밍을 짜보자 - codepad (0) | 2016.04.21 |
리눅스 환경에서 윈도우 rdp 사용하기 (0) | 2016.03.31 |
GCC 설치시 필요한 의존성 라이브러리 목록 (0) | 2016.03.31 |
Comments