파게로그
기본 자료형과 연산자 본문
정수에 대한 접두사와 접미사
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 |