Ch3-9~10. 산술변환
0. 목차
Chapter3. 연산자
Ch3 - 9. 사칙 연산자
Ch3 - 10. 산술 변환
Ch3 - 9. 사칙 연산자
▶ + - * /
▷ 10 / 4 = 2?
▷ 컴퓨터는 같은 타입끼리만 계산가능
▷ 10 ÷ 4 = 2.5
▷ 10(int) / 4(int) = 2(int) // 소수점 이하는 버려짐
▷ 10(int) / 4.0f → 10.0f / 4.0f = 2.5f // 결과를 실수로 얻으려면 피연산자 타입을 실수로 통일
int a = 10, b = 4;
System.out.printf("%d ÷ %d = %d%n", a, b, a / b);
System.out.printf("%d ÷ %f = %f%n", a, (float)b, a / (float)b);
// console
10 ÷ 4 = 2
10 ÷ 4.000000 = 2.500000
Ch3 - 10. 산술 변환
▶ 산술 변환이란?
▷ 연산 전에 피연산자의 타입을 일치시키는 것
① 두 피연산자의 타입을 같게 일치 - 보다 큰 타입으로 일치
long(8 byte) + int(4 byte) → long + long = long // long > int
float(4 byte) + int(4 byte) → float + float = float // float의 범위 ⊃ int의 범위
double(8 byte) + float(4 byte) → double + double = double // double > float
② 피연산자의 타입이 int보다 작은 타입이면 int로 변환
-
int보다 작은 타입 = byte, char, short
· byte : -128 ~127
· char : 0 ~ 6만
· short : ±3만 - ‘300 × 300 = 9만’ 이 정도만 계산해도 short의 범위를 넘어버림
- 오버플로우 발생
- 그래서 int보다 작은 단위는 오버플로우 방지를 위해 int로 변환
byte(1 byte) + short(2 byte) → int + int → int
char(2 byte) + short(2 byte) → int + int → int
▶ 산술 변환 예시
▷ char - char → int - int = int
'2'(char) - '0'(char) → 50(int) - 48(int) = 2(int)
▷ long = int × int → long = long × int
int a = 1_000_000, // 1백만 = 10의 6제곱
b = 2_000_000; // 2백만 = 10의 6제곱
long c = a * b; // 10의6제곱 * 10의6제곱 = 10의 12제곱
System.out.println(c);
// console
-1454759936 // ?? 오버플로우 난듯,,
long c = a(int) * b(int)
-
문제① int의 범위는 10의9제곱 결과값은 10의12제곱, 오버플로우 발생
문제② long에 int를 넣으려면 값손실 발생 - 해결 a나 b 둘 중 하나를 int → long으로 수동 형변환
- 오버플로우 벗어나는 법
- int → long 수동 형변환
long c = a * b;
long c = (long)a * b;
int a = 1_000_000, // 1백만 = 10의 6제곱
b = 2_000_000; // 2백만 = 10의 6제곱
long c = (long)a * b; // 10의6제곱 * 10의6제곱 = 10의 12제곱
System.out.println(c);
// console
2000000000000
- 계산과정
long c = (long)a * b;
long c = (long)1000000 * 2000000;
long c = 1000000L * 2000000;
long c = 1000000L * 2000000L;
long c = 2000000000000L;