데이터 오버플로우와 형변환
1. 데이터 오버 플로우
컴퓨터의 데이터는 0과 1로 나뉘어져있으며, 이 크기는 1bit이다.
자료형을 보면 크기가 정해져있는데, 1byte는 8 bit(23)이다.
1byte=
bit | bit | bit | bit | bit | bit | bit | bit |
값이 허용된 크기를 넘어가면서, 자료값이 손실되는 것을 오버플로우 라고 한다.
1byte 인 byte는 -128부터 127 까지를 저장 할 수있다.
만약 128을 byte에 저장하려고 한다면 오버플로우가 일어나 127 +1 = -128 의 값이 되는 것이다.
2. 형변환
값의 자료형을 바꾸는 것이다 .(boolean은 제외한다.)
식
자료형 a = (a의 자료형)b;
예를 들어 short b = 129 이 있다고 하자. 이를 다른 자료형의 변수로 바꿔본다.
byte a = (byte)b; -> -127 (오버플로우가 일어남)
int c = 129;
b = (short)c; -> 129 (short형)
int d = (int)b; -> 129 (int형)
이렇게 다른 자료형으로 바꾸는 것을 형변환이라 하는데, 큰 자료형으로 변환 할 경우에는 값에 있는 자료형을 생략 할 수있다. 즉 int d = b 라고 사용해도 오류가 나지 않는다. 이는 컴파일러가 자동으로 형변환 해주기 때문이다.
문제가 되는 것은 작은 자료형으로 변환 할 때인데 이 경우 변환 될 자료형의 허용범위를 벗어날 경우 오버플로우가 일어나며, 이 때문에 작은 자료형으로 형변환 할 때는 반드시 값에 자료형을 명시해 주어야 한다.
이 뿐만아니라 실수를 정수로 형변환 할 시에는 소수점을 모두 버려 데이터의 자료값이 손실 되기에 이 역시 반드시 명시해주어야 한다.
float f = 12.60f
int i = (int)f -> 12(int형)
char의 경우 int로 형변환 하면 아스키 코드 값으로 변환된다. 정수와 계산하면 그 값으로 계산한다.
int g = 'a'; -> 97
int v = 'a' + 2;-> 99
3. 자료형이 다른 정수/ 실수의 계산
자료형이 다른 것 끼리 계산을 할 경우 큰자료형/ 실수형의 값으로 값이 출력된다.
즉 받아줄 변수의 자료형은 큰 자료형/실수로 지정해주어야한다. 다만 byte와 short값의 계산 결과는 무조건 int로 처리된다.
int a= 1;
double b = 1.0;
double result = a+b; ->2.0
이 경우 2라고 생각하고 받아줄 변수의 자료형을 int로 쓰면 에러가 난다.
이것을 억지로라도 작은자료형/정수 로 저장 하고 싶으면 형변환을 해주면된다.
int d = (int)(a+b);
int e = a +(int)b;