chapter02 4기본형,5형변환

byeol·2022년 7월 2일
0

Java의 정석

목록 보기
4/9

4. 기본형

<복습>
자료형은 기본형과 참조형이 있으며
기본형은 연산이 가능하다 참조형은 객체의 주소를 저장하며 연산이 불가능하다.

클래스 이름 참조형변수 이름;
ex) Data today= new Data();//Data클래스 타입의 참조변수 today 선언

기본형

  • 논리형-boolean: true(not TRUE), false(not FALSE)
  • 문자형-char (2byte)
  • 정수형 -byte(1byte) short(2byte) int(4byte) long(8byte)
    [S:부호 양수0 음수1 1bit][n-1bit]
    [0][n-1bit] : 0, 양수 => 2^(n -1)개 => 0~2^n-1
    [1][n-1bit] : 음수=> 2^(n-1)개 => -1~-2^n
    int: 약 -20억~20억
    **정수형의 오버플로우: 타입이 표현할 수 있는 값의 범위를 넘어서는 것
    최댓값+1=최솟값
    최솟값-1=최댓값
  • 실수형-float(4byte), double(8byte)

    실수형은 정밀도가 중요하다
    float은 7자리의 10진수
    double은 15자리의 10진수를 오차없이 저장한다.

    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까지 표현할 수 있다.

5. 형변환 : 타입을 다른 타입으로 변환

(타입) 피연산자

  • 정수형 간의 형변환
    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
    	}

}

profile
꾸준하게 Ready, Set, Go!

0개의 댓글