연산자, 오버플로우 & 언더플로우 등

고태경·2023년 6월 24일
0

JAVA

목록 보기
4/9

⭐ 연산시 int보다 작은 정수 타입이면 연산 결과는 int

부호 연산자

+와 -
+:부호를 유지
-:부호를 변경

 ⭐int보다 허용하는 범위가 작은 정수 타입은 연산시 int로 변경
 -> int보다 허용하는 범위가 작은 정수 타입에 - 연산자를 사용시 int형이 됨
int x = 10; 
int y = 10;
int z;

x++; // 11
++x; // 12
System.out.print(x); // 12 , 변수 단독은 전위 후위 동일

y--; // 9
--y; // 8
System.out.print(y); // 8

z = x++;
System.out.print(z); // 12 , ⭐기존 z = x를 먼저 수행
System.out.print(x); // 13 , x 증가

z = ++x;NaN(Not A Number)은 연산 과정에서 잘못된 입력을 받았음을 나타내는 기호
System.out.print(z); // 14
System.out.print(x); // 14

z = ++x + y++; // x = 15, y = 8
System.out.print(z); // 23
System.out.print(x); // 15
System.out.print(y); // 9, y 증가

오버플로우와 언더플로우

오버플로우 : 허용 가능한 최댓값을 넘어간 것
언더플로우 : 허용 가능한 최솟값을 넘어간 것
-> 컴파일 오류가 아닌 각각 최대로, 최소로 넘어감

정확한 계산에는 정수 연산

실수 연산은 정밀도가 제한되어 있어 정확한 값이 안 나올 수도 있음

NaN과 Infinity 처리

NaN? Not A Number, 연산 과정에서 잘못된 입력을 받았음을 나타내는 기호
Infinity? 무한대

확인법
boolean a = Double.isInfinity(변수);
boolean b = Double.isNaN(변수);

동등 연산자

char은 정수형으므로 'A' == 65의 결과는 true
'A'가 int 타입으로 변환되어 비교하기 때문!

3 == 3.0
3이 double 타입으로 변환된 뒤 비교

but! 0.1f와 == 0.1은 false (정밀도 차이)
0.1f와 == (float)0.1로 강제 형 변환 필요

문자는 equals() 메소드 이용

논리 연산자

and 논리곱 연산자 (모두 만족해야 true) : & &&
or 논리합 연산자 (한 개 이상 만족하면 true): | ||
XOR 베타적 논리합 연산자 (두 경우가 달라야 true): ^
NOT 논리 부정 연산자 (논리값을 뒤집음) : !

비트 논리 연산자

  • 정수타입일 경우에만 가능
  • 피연산자가 0, 1
  • true는 1, false는 0
    and 논리곱 연산자 (모두 만족해야 1) : &
    or 논리합 연산자 (한 개 이상 만족하면 1): |
    XOR 베타적 논리합 연산자 (두 경우가 달라야 1): ^
    NOT 논리 부정 연산자 (논리값을 뒤집음) : ~

int보다 작은 피연산자를 int로 자동변환 후 연산됨
-> 결과도 int 타입

int 변수명 = Byte.toUnsignedInt(바이트 타입 변수명)

비트 이동 연산자

a ' ' n 형태
'>>' : 오른쪽으로 n칸 이동 a X 2^-n 하는 거랑 같음, 왼쪽을 msb 부호로 채움
'<<' : 왼쪽으로 n칸 이동 a X 2^-n 하는 거랑 같음, 오른쪽을 0으로 채움
'>>>' : 오른쪽으로 2칸 이동 a X 2^-n 하는 거랑 같음, 왼쪽을 0으로 채움 (자바에만 존재)4

대입 연산자

단순 대입 연산자
복합 대입 연산자

삼항(조건) 연산자

{조건식}?{true일 때 값이나 연산식}:{false일 때 값이나 연산식}

연산의 우선순위

보통적으로 -> 방향으로 진행
()를 통해 우선순위 조정 가능

profile
컴퓨터정보과

0개의 댓글