/ JAVAJUNGSUK

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;