- Do it! 자바 프로그래밍 입문 온라인 강의를 수강하며 작성하였습니다.
- Section 0. 자바 기본 익히기
- 2강 "변수와 자료형(1)"
- 2진법과 16진법 -> 2진법에서 음수 표기 방법
컴퓨터는 0과 1로만 데이터를 저장한다.
bit(비트) : 컴퓨터가 표현하는 데이터의 최소 단위로 2진수 하나의 값을 저장할 수 있는 메모리의 크기
byte(바이트) : 1byte = 8bit
10진수 | 2진수 | 16진수 |
---|---|---|
1 | 0000 0001 | 01 |
2 | 0000 0010 | 02 |
3 | 0000 0011 | 03 |
4 | 0000 0100 | 04 |
. . . | . . . | . . . |
9 | 0000 1001 | 09 |
10 | 0000 1010 | 0A |
11 | 0000 1011 | 0B |
. . . | . . . | . . . |
14 | 0000 1110 | 0E |
15 | 0000 1111 | 0F |
16 | 0001 0000 | 10 |
표에서 확인할 수 있듯이 16진수는 2진수 4bit를 한번에 표현 가능하다.
1111(2) = F(16)
public class BinaryTest {
public static void main(String[] args) {
int num = 10;
int bNum = 0B1010; // 2진수 1010 => 10진수로 10
int oNum = 012; // 8진수 12 => 10진수로 10
int hNum = 0XA; // 16진수 A => 10진수로 10
System.out.println(num);
System.out.println(bNum);
System.out.println(oNum);
System.out.println(hNum);
}
}
Eclipse에서 실행해본 결과 모두 10이 나온다.
2진수는 0B, 8진수는 0, 16진수는 0X를 앞에 붙여서 표현 가능하다.
(2진수 : binary, 8진수 : octal, 16진수 : hexadecimal)
정수(Int)는 일반적으로 32bit로 표현한다. (0000 0000 0000 0000 0000 0000 0000 0000)
예시에서는 편의상 8bit로 표현하겠다.
맨 앞 숫자를 MSB(Most Significant Bit)라 하며 부호 비트로 사용되고,
부호비트가 0이면 양수, 1이면 음수가 된다.
10진법 5를 2진법으로 표현하면 0000 0101 (2) 이다.
그러나 -5는 부호비트를 1로 바꿔서 1000 0101 (2) 로 표현하지 않는다.
왜냐하면 5와 -5를 더하면 0이 되어야 하므로 2진수끼리 더해도 0이 되어야 한다.
0이 아닌 두 수를 더해서 0이 될 수 없으므로 2의 보수를 더하는 방법을 사용한다.
- 보수란, 상호 보완하는 수로, 임의의 수를 보완해주는 다른 임의의 수다.
- 쉽게 말해서, 더해서 n이 되는 수를 "n의 보수" 라고 한다. ex) 4의 10의 보수는 6이다.
- 80 - 48이라는 식이 있다고 했을 때, 48의 10의 보수는 52이고,
80 + 52 = 132이므로, 여기서 삐져나온 자릿수 100을 빼면 32가 된다.
컴퓨터에서는 4bit로 표현했을 때, 1010(2) 와 0110(2) 를 더하면
1 0000 (2) 가 되는데 맨 앞의 1은 4bit를 초과하여 날아가서 결과가 0이 된다.
즉, 2의 보수를 더하면 결과가 0이 된다.
0000 0101 (2)
1111 1010 (2) <= 1의 보수
1111 1011 (2) <= 1의 보수에 1을 더함
최종적으로 0000 0101 (2) 와 1111 1011 (2) 를 더하면
1 0000 0000 (2) 가 되어 0이 되므로
-5는 2진법으로 1111 1011 (2) 로 표현하면 되겠다.
Eclipse에 직접 입력하여 결과를 확인해보자.
public class BinaryTest2 {
public static void main(String[] args) {
int num1 = 0B00000000000000000000000000000101; //2진수 5
int num2 = 0B11111111111111111111111111111011; //2진수 -5
System.out.println(num1);
System.out.println(num2);
System.out.println(num1 + num2);
}
}
더한 결과가 0이 나오는 것을 확인할 수 있다.