자료형변환시 주의할 점 및 자료형 범위

Programming/C++_C#|2016. 10. 14. 14:02
반응형

프로그래밍을 하다보면 처음 기초에서 배우는 것 중에 하나가 자료형이다.

char, short, int등등.....

문제가 생겼던 거는 전투력을 계산해야되는 코드가 있었는데 음수값이 들어와 그 값이 엄청 커진 경우였다.


어떤 함수에서 인자값으로 자료형을 signed short(2바이트)를 보내주었는데

그걸 받아서 계산시 unsigned long(4바이트)로 형변환을 시켜서 연산을 하였다.


예시코드

unsigned long ulResult = (unsigned long) ((short변수1 + short변수2) / 2);



이 때 문제가 생기는 경우는 다음과 같다.


signed -> unsigned형으로 바뀔 때 음수 값이 들어왔을 때

양수 값이 들어오면 상관없다. (하지만 이 경우도 더 작은 자료형으로 형 변환하면 문제가 된다. short->char로 변환시)
음수 값이 들어왔을 때 문제가 된다.

컴퓨터는 음수를 저장하는데 2의 보수를 사용하는데 2의 보수란 1의 보수에서 더하기 1을 한 것을 말한다.

0이상인 양수의 경우에는 MSB(부호비트:제일 왼쪽 첫 번째 비트) 0이 저장되고 나머지는 값의 크기를 표현하지만 

음수는 MSB 1을 저장하고 2의 보수를 사용한다.

) 0001일 때(== 1) 1의 보수로 바꾸면 1110이고 2의 보수로 바꾸면 1111
   1111
-1 2의 보수로 나타낸 것.

   1111( == -1 )
   1110( == -2 )

   1101( == -3 )

   1100( == -4 )

   1011( == -5 )

따라서 signed 정수형을 -1unsigned형으로 변환하면 그 자료형의 가장 큰 값으로( 1111 )
나오게 되는 것이다.( -1뿐 아니라 다른 음수도 그 자료형에서 unsigned로 계산된 값이 나옴 )


내용들을 알기 쉽게 쓴 예제이다.

결과값↓

위와 같이 숫자가 변하게 되고 작은 자료형으로 형변환할때는 아무것도 안나오게 된다.



★아래 자료는 운영체제에 따라 바뀌는 부분도 있으니 유의.

키워드

크기

표현 범위

char

1byte

-128 ~ 127

unsigned char

1byte

0 ~ 255

short

2byte

-32,768 ~ 32,767

unsigned short

2byte

 0 ~ 65,535

int

4byte

-2,147,483,648 ~ 2,147,483,647

unsigned int

4byte

 0 ~ 4,294,967,295

long

4byte

-2,147,483,648 ~ 2,147,483,647

unsigned long

4byte

0 ~ 4,294,967,295


반응형

'Programming > C++_C#' 카테고리의 다른 글

[C++] 오버로딩함수  (0) 2017.02.23
fopen, fclose, fseek함수  (0) 2017.02.23
[C++] 가변인자함수  (0) 2017.02.14
[API] 윈도우 api 아이콘 바꾸기  (0) 2016.11.15
memset함수 주의할 점  (0) 2016.10.26

댓글()