자료형변환시 주의할 점 및 자료형 범위
프로그래밍을 하다보면 처음 기초에서 배우는 것 중에 하나가 자료형이다.
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 정수형을 -1을
unsigned형으로 변환하면 그 자료형의 가장 큰 값으로( 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 |