파게로그

기본 자료형과 연산자 본문

콤퓨타 왕기초/Java

기본 자료형과 연산자

파게 2020. 11. 8. 13:12

정수에 대한 접두사와 접미사

2진법 0b11010
8진법 032
10진법 26
16진법 0x1a
public class IntegerSystemTest {
	public static void main(String[] args) {
		System.out.println(0b1010); // 10
		System.out.println(10); // 10
		System.out.println(012); // 10
		System.out.println(0xA); // 10
	}
}

 

긴 정수(8byte)

long n1 = 26L;

long n2 = 0x1aL;

 

실수

123.4 // 8byte(double형)

123.4f // 4byte(float형)

123.4d // 8byte(double형)

1.234e // 부동 소수점형, 지수 표기법. f/d 표시하지 않으면 double

1.234e2f

1.234e2d

 

문자

'A'

'\u0065' // A. 코드값을 통해서 문자 표현

 

묵시적 형변환

long x = 85;

byte x = 85; // 컴파일 에러. byte x = (byte)85; (명시적 형변환 필요)

double x = 3.5f;

float x = 3.5; // 컴파일 에러. float x = (float)3.5; (명시적 형변환 필요)

 

정수 값의 크기와 범위

8bit라고 한다면

MSB(Most Significant Bit)를 부호 표시를 위해 사용하고

-2^7 <= n <= 2^7 - 1까지 표현할 수 있다.

0이 2개니까, 10000000을 -128로 이용하여 1만큼 더 표현할 수 있도록 한 것이다.

 

"현대의 컴퓨터는, signed int를 저장하기 위해 2의 보수 방식을 사용한다!"

매그니튜드
MSB를 부호 비트이다. 나머지는 절댓값을 나타낸다.
단, A+B부터 난해하다.

1의 보수
MSB는 부호 비트이다.
0은 2개 존재한다. (0000, 1111)
숫자의 부호를 바꾸기 위해서는, 각 비트를 바꾸어주면 된다.
+3 = -(-3) = ~(1100) = 0011
A+B는 각 비트끼리 더하여 계산한다. A-B는 A와 B의 보수를 더하여 계산한다.
단 0이 2개라는 점, 마지막 컬럼의 캐리를 추적해야 하는 점 때문에 잘 쓰이지 않는다.

2의 보수
MSB는 부호 비트이다.
양수는 0000, 0001, 0010, 0011, ..., 0111(+7)
음수는 1111, 1110, 1101, 1100, ..., 1000(-8)
수의 부호 변경을 위해서는 각각의 비트를 보수화 한 후, 그 결과에 1을 더한다.
예를 들어, -(-3) = ~(1100)+1 = 0011이다. A의 보수인 -A = 2^n - A
A+B는 단순히 비트끼리 더하기만 하면 되고,
A-B는 A와 B의 보수를 더하면 된다.

 

고정 소수점(fixed point)와 부동 소수점(float point) 실수의 크기와 범위

32bit라고 한다면

고정 소수점형에서는, MSB가 부호 비트, 15bit가 정수부, 16bit가 소수부.

유연하지 못하고, 표현 가능한 정수 범위가 -2^15~2^15-1에 불과하다.

 

부동 소수점형에서는, MSB가 부호 비트, 8bit가 지수부, 23bit가 가수부.

12.125 = (2진법)1100.0010 = (2진법)1.1000010 = 1.1000010e3

여기에서 1000010은 가수부로, 3은 지수부로.

11111111011111111111111111111111 ~ 01111111011111111111111111111111

-3.402823466E+38 ~ 3.402823466E+38

 

3항 연산자 ? :

int score = 100;

char grade = (score > 90) ? 'P' : 'U'; // P

 

객체 형식 비교 연산자

Galaxy myPhone = new Galaxy();

myPhone instanceof Galaxy; // True

 

비트 논리 연산자

& (val1 & val2) 비트 교집합 연산자

| (val1 | val2) 비트 합집한 연산자

^ (val1 ^ val2) 비트 차집합 연산자

~ (~val1) 비트 부정 연산자

public class BitOperatorsTest {
	public static void main(String[] args) {
		// 10: 00001010
		// 06: 00000110
		
		// NOT
		System.out.print("~10: ");
		System.out.println(~10); // ~10 = 11110101 = -11
		
		// SHIFT
		System.out.print("10<<2: ");
		System.out.println(10<<2); // 10<<2 = 00101000 = 40
		
		// AND
		System.out.print("10&6: ");
		System.out.println(10&6); // 10&6 = 00000010 = 2
		
		// OR
		System.out.print("10|6: ");
		System.out.println(10|6); // 10|6 = 00001110 = 14
		
		// XOR
		System.out.print("10^6: ");
		System.out.println(10^6); // 10^6 = 00001100 = 12
	}
}

 

쉬프트 연산자

<< (val1 << n) 왼쪽 쉬프트 연산자

>> (val1 >> n) 오른쪽 쉬프트 연산자

3 << 2 ▶ 0011 << 2 ▶ 1100 ▶12 (왼쪽으로 쉬프트할 때, 가장 뒤의 수와 관계없이 0으로 채워진다.)

3 >> 2 ▶ 0011 >> 2 ▶ 0000  0

11 >> 2 ▶ 1011 >> 2 1110 ▶ 13 (오른쪽으로 쉬프트할 때, 가장 앞의 수가 1이면 1로 채워진다. 부호 비트 때문)

 

예를 들어, 용량을 아끼기 위해서 short형 변수 pos에 100 이하의 x, y 좌표를 저장하고자 시도할 수 있다.

16bit에서 왼쪽 8bit를 x값으로, 오른쪽 8bit를 y값으로 이용한다.

int pos = 7; // x=7
pos << 8; // x를 왼쪽 8bit 자리에 넣어준다.
pos = pos | 5; // 왼쪽 8bit는 그대로 내려올 거고, 오른쪽 8비트에 5가 더해진다.

 

연산자 우선순위

1 expr++   expr--
2 ++expr   --expr   +expr   -expr   ~   !
3 *   /   %
4 +   -
5 <<   >>   >>>
6 <   >   <=   >=   instanceof
7 ==   !=
8 &
9 ^
10 |
11 &&
12 ||
13 ? :
14 =   +=   -=   *=   /=   %=   &=   ^=   |=   <<=   >>=   >>>=

'콤퓨타 왕기초 > Java' 카테고리의 다른 글

break문에서의 label  (0) 2020.11.12
입출력  (0) 2020.11.08
Windows에서 cmd로 Java 프로그램 컴파일  (0) 2020.10.30
Java에 대한 전반적인 지식  (0) 2020.10.30
큰 그림  (0) 2020.10.30
Comments