[즐거운 자바] 정수, 실수, 산술연산자
정수
8bit = 1 byte
[부호비트] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
- 부호비트가 0 이면 양수, 1 이면 음수가 된다
- 그래서 7bit 만 사용할 수 있고 1byte에서 가장 큰 수는 01111111(2) = 127 가 된다
16bit =4byte
-
1bit는 부호비트로 사용하고 15bit를 표현하는 데 사용할 수 있다
- byte = 1 byte : -128(-2의 7승) ~ 127(2의 7승)
- short = 2byte : 2의 15승
- int = 4 byte : 2의 31승
- long = 8 byte : 2의 63승
- 뒤에 L이나 l을 붙히면 long 타입이 되는데, 헷갈리기에 L(대문자)로 많이 쓴다
int x = 5; 숫자 5는 리터럴이며 int 타입이다
long y = 5L; y는 long 타입이다. 5은 long 타입 리터럴이다.
음의 정수
2의 보수로 처리해준다
-1
을 만들려면
- 보수처리 0을 1로, 1을 0으로 바꿔준다
- 1을 더해준다
1 = 0000 0001 을 음수로 만들자
- 1111 1110
- 1111 1111
값의 범위 쉽게 계산하기
byte는 8 bit를 쓰고 1을 부호비트로 사용하기 떄문에
2의 (8-1)승
이다
마찬가지로 long은 8byte 이기 떄문에 64bit(8bit*8)를 사용하고
1bit는 부호비트이기 때문에
2의 (64-1)승
이다
왜 값의 범위에서 -1을 해야할까?
부호비트를 빼고 총 7bit를 사용할 수 있다.
7비트로 표현할 수 있는 숫자의 갯수는 127개이다.
그래서 양수 부분(부호 비트가 0)에서 0 ~ 127까지 표현해서 127개를 사용하고,
음수 부분(부호 비트가 0)에서 -1 ~ -128를 표현한다.
127 = 0111 1111 를 음수로 만들자
- 1000 0000
- 1000 0001 = -127
-127에서 -1 을 더해서 -128을 만들자 1000 0001 (-127)
- 1111 1111 (-1) = 1 1000 0000 (-128) 🔝
이렇게 오버플로우 된 캐리비트(올림)는 버린다
그래서 -128은 이진수로 1000 0000 이 된다
정수의 최댓값과 최솟값
자바 문서를 보면 Integer 클래스에 정의된 필드가 어떤 것이 있는지 볼 수 있다
public class Hello {
public static void main(String[] args){
System.out.println(Integer.MIN_VALUE);
System.out.println(Double.MAX_VALUE);
}
}
와 같이 사용할 수 있다.
오버플로우
계산 결과가 최댓값을 넘거나 최솟값보다 작을 경우 양수->음수, 음수->양수로 바뀌는 문제.
public class Hello {
public static void main(String[] args){
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MIN_VALUE-1);
}
}
를 하면
-2147483648 2147483647
가 출력된다
127 +1 을 하면 -128이 된다.
실수
float
- 5.2f 는 float 형 이 된다
- 4byte
- 소수점 아래 6자리 까지 오차없이 표현할 수 있다
double
- 5.2라는 리터럴은 double 형이 된다
- 5.2D라고 명시적으로 표현할 수 있지만 생략 가능하다
- 8byte
- 소수점 아래 15자리 까지 오차없이 표현할 수 있다
산술 연산자
- / : 나누기 정수를 정수로 나누면 잘림 현상이 발생한다. 5/2는 2로 소수 뒷 부분이 버려진다
- % : 모듈러(나머지)
- () : 괄호 안의 내용부터 계산한다
증가 연산자와 감소 연산자
- ++ : 메모리에 있는 값을 1만큼 증가시킨다
- a++ : a 에 1을 더한다
a++;
- a++ : a 에 1을 더한다
- – : 메모리에 있는 값을 1만큼 감소시킨다
- a– : a 에 1을 뺀다
산술 대입 연산자
a=5;
a+=3; // a=a+3; 과 같은 말이다 -> 8이 된다
a*=2
a/=2
a%=2
Leave a comment