번개애비의 라이프스톼일

char에서 오버플로우 되는 연산의 결과 본문

IT

char에서 오버플로우 되는 연산의 결과

번개애비 2016. 4. 21. 13:21

char는 기본적으로 -128~127 내의 숫자만 담을 수 있는 그릇입니다.


자료형키워드
메모리 크기값의 범위
문자형char
1 Bytes-128~127
정수형short2 Bytes-32,768~32,767
int4 Bytes-2,147,483,648
~ 2,147,438,647
long4 Bytes-2,147,483,648 
~2.147.483.647
부호없는 문자형unsigned char1 Bytes0~255
부호없는 정수형unsigned short2 Bytes0~65,535
unsigned int4 Bytes0~4,294,967,295
unsigned long4 Bytes0~4,294,967,295
부동 소수형float4 Bytes1.2E-38~3.4E38
double8 Bytes2.2E-308~1.8E308
void형void0 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

Comments