<복습>
자료형은 기본형과 참조형이 있으며
기본형은 연산이 가능하다 참조형은 객체의 주소를 저장하며 연산이 불가능하다.
클래스 이름 참조형변수 이름;
ex) Data today= new Data();//Data클래스 타입의 참조변수 today 선언
기본형
float : 0.123456789012345 => 1.234567 X 10-1
double: 0.123456789012345 => 1.23456789012345 X 10-1
public class FloatEx1 {
public static void main(String[] args) {
float f =9.12345678901234567890f;
float f2 =1.2345678901234567890f;
double d = 9.12345678901234567890d;
//실수형의 값의 범위와 정밀도
System.out.printf(" 123456789012345678901234%n");
//123456789012345678901234
System.out.printf("f : %f%n", f);
//f : 9.123457
//6자리까지만 나타내고 7자리에서 반올림
System.out.printf("f : %24.20f%n",f);
//f : 9.12345695495605500000
//24자리 중 20자리는 소수이하의 자리, 7자리까지만 일치
System.out.printf("f2 : %24.20f%n", f2);
//f2 : 1.23456788063049320000
// 간혹 8자리까지도
System.out.printf("d : %24.20f%n", d);
//d : 9.12345678901234600000
// double은 15자리까지
이는 얼마나 큰 값을 저장할 수 있느냐 + 얼마나 작은 값을 정밀하게 표현할 수 있느냐 둘다 중요하다는 것을 나타낸다.
예를 들어
실수표현을 4byte(32bit)에 부호 1bit, 정수 16bit, 소수 15bit
263.3=0 0000000100000111.010011001100110(2)
정수표현 bit ↑, 큰수 표현 O , 정밀도 ↓
정수표현 bit ↓ , 큰수 표현 X , 정밀도 ↑
=> 소수점을 고정X, 둥둥 떠다니게 부동소수점!!을 이용하기로 한다.
즉, 부동소수점이라 함은 위의 예시를 아래와 같이 표현하도록 약속한다. 1.0000011101001100110..X 2^8
[0][10000111][00000111010011001101101]
S: 양수->0
E: 8+127(기저)=135
∓ S(부호)E(지수)M(가수)
float: 1(S)+8(E)+23(M)=32bit
double: 1(S)+11(E)+52(M) =64bit
이 예시의 경우 20.0f를 넣는다.
자 이제 20을 부동소수점으로 표현해보자
1) 20을 이진수로 표현한다. ➡️ 10100(2), 양수이므로 부호는 0으로 채워진다.
2) 이제 가수와 지수를 생성해보자 10100(2)= 1.0100 x 2의 4승
3) 가수는 0100 가수부분의 왼쪽부터 채운다.
4) 지수는 4인데 Bias인 127을 더해서 131이 된다.
131의 2진수는 ➡️ 10000011(2)
이는 28=256 그러나 부호가 있으므로 -126~127까지로 범위가 정해진다
최대 2127 최소 2-126까지 표현할 수 있다.
(타입) 피연산자
정수형 간의 형변환
byte -> int 음수의 경우만 눈여겨 보자
다시 복습
2는 00000010
-2 = (1의 보수 11111101)+1=11111110
이를 int로 바꾸면
111111111/11111111/11111111/11111110
실수형 간의 형변환
실수는 3부분으로 나눠져 있기 때문에
나눠서 생각한다
부호는 그대로
지수
float->double : 127을 빼고 1023을 더한다
double->float: 1023을 빼고 127을 더한다.
가수
float->double : 23자리 채우고 남은 29자리는 0으로 채운다
double->float : 52자리 중 23자리만 채우고 버려진다.
단, 24자리에서 반올림이 발생한다!
정수형과 실수형 간의 형변환
정수형-> 실수 : 정밀도에 의해서 float과 double 중에 선택
실수-> 정수 :소수점 버려짐
자동 형변환
큰데이터타입 변수 = 지정된 작은 리터럴 타입
=> 자동 형변환
작은데이터타입 변수= 지정된 큰 리터럴 타입
=> 에러
서로 다른 두 타입에서의 연사
=> double a= 1+ 1.0;
=> double = (double)+(double)
=> 이렇게 큰 쪽으로 간다
public class 형변환_연습 {
public static void main(String[] args) {
double a;
int i=3, j=3;
short b;
char c=1000;
a= i+j;
b=(short)(i+j);
//b=i+j//error 역방향의 형변환은 반드시 연산자를 써줘야 한다.
System.out.println(a);//6.0
System.out.println(c);//Ϩ
System.out.println(b);//6
}
}