1. 10진법과 2진법
인류는 대부분 10진법을 사용하여 수를 계산한다. 반면에 컴퓨터는 2진법을 기반으로 설계가 되었기 때문에 연산 시에 10진수 값을 2진수 값으로 변환해줘야 한다. 우리가 변수에 값을 저장할 때에도 10진법의 수가 2진법으로 변환되어 저장이 되어진다.
2진법의 각 자리는 0 아니면 1밖에 표현을 못하기 때문에 10진법의 수를 2진법으로 바꾸는 경우 10진법에 비해 많은 자리수를 필요로 한다.
2. 비트와 바이트
한 자리의 2진수를 bit라고 하며 1bit는 컴퓨터가 값을 저장할 수 있는 최소단위이다. 그러다 1bit는 너무 작은 값이기 때문에 1bit를 8개 묶어서 1byte로 정의하여 기본 단위로 사용한다.
이외에도 word라는 단위가 있는데 이는 CPU가 한번에 처리할 수 있는 데이터의 크기를 말한다. 워드의 크기는 CPU의 성능에 따라 달라지는데, 32비트 CPU에서는 1워드가 32비트 (4바이트)이고 64비트 CPU 에서는 64비트 (8바이트)이다.
n비트는 2^n개의 값을 표현할 수 있는데, 이는 10진수로 변환하면 0 ~. 2^(n - 1) 까지의 수를 표현할 수 있다는 의미이다.
3. 8진법과 16진법
2진법은 오직 0과 1만으로 숫자를 표현하기 때문에 자리수가 굉장히 길어진다는 단점이 있다. 이러한 단점을 보완하기 위해서 8진법과 16진법을 사용한다. 8진법은 0~7 까지의 숫자를 기호로 사용하고 16진법은 0~9까지의 숫자와 알파벳 A~F를 추가로 사용한다. A가 10, F가 15를 의미한다.
- 2진수 -> 8진수, 16진수 변환
2진수를 8진수로 변환하기 위해서는 뒤에서부터 3자리씩 끊어서 계산하면 된다. 3자리씩 끊어서 나온 이진수를 각각 8진법으로 변환한 수를 끝에서부터 순서대로 추가하면 된다.
16진법의 경우 2의 4승이기 때문에 4자리씩 끊어서 변환하여 주면 된다.
4. 정수의 진법 변환
- 10진수를 n진수로 변환
10진수를 다른 진수로 변환하려면 해당 진수로 나누는 것을 반복하여 구할 수 있다. 해당 진수로 나눈 후 나머지 값을 결과에 추가하고 더 이상 나눌 수 없을 떄까지 반복하여서 매 회의 나머지 값을 결과에 추가하여 변환을 완료한다.
- n진수를 10진수로 변환
반대로 n진수를 10진수로 변환하기 위해서는 각 자리수에 알맞은 단위의 값을 곱하여 그 합을 구해 변환할 수 있다. 2진수의 경우 제일 오른쪽 값에 2^0 부터 왼쪽으로 한칸씩 갈 수록 2를 곱하여 해당 자리의 값과 곱해 결과를 구한다.
5. 실수의 진법변환
- 10진 소수점수 -> 2진 소수점수
정수 10진수를 2진수로 바꾸는 경우 2로 나누면서 나머지를 구하는 방식을 반복하여 변환하였다. 실수의 경우 이와 반대로 2를 곱하는 방식으로 진행한다.
매번 2를 곱하여 정수부분을 결과에 추가하고 소수부만 취하여 다시 2를 곱하는 과정을 반복한다. 소수부가 0이 될때까지 반복한다. 과정이 완료된 후 정수부를 취하여 추가된 결과의 앞에 소수점을 추가하여주면 변환이 완료된다.
- 2진 소수점수 -> 10진 소수점수
소수점 첫째자리가 2의 -1승 자리수가 되고 오른쪽으로 갈수록 2의 -1승씩 자리수의 값이 곱해지게 된다.
이러한 방식으로 각 자리수와 값을 곱하여 그 합을 구해 변환을 진행한다.
6. 음수의 2진 표현 - 2의 보수법
이진법에서 부호를 표시하기 위해서는 왼쪽의 첫번째 비트 (MSB, most significant bit)를 사용한다. 이 자리의 값이 0이면 양수, 1이면 음수를 표현하도록 한다.
- 2의 보수법
어떤 수의 n의 보수라는 뜻은 더했을 때 n이 되는 수를 말한다. 예를 들어 7의 10의 보수는 3이고, 3의 10의 보수는 7이다. 2의 보수 관계 또한 더해서 2가 되는 두 수를 의미한다. 이진수에서 2는 10인데 이는 자리올림이 발생하고 0이 되는 수를 의미한다. 그래서 2의 보수에 있는 2진수를 더하면 자리올림이 발생하고 값은 0이 된다.
- 음수를 2진수로 표현하기
10진 음의 정수를 2진수로 변환하려면 먼저 10진 음의 정수의 절대값을 2진수로 표현해야한다. 그 다음에 이 수의 2의 보수를 구하면 된다.
-5(10) -- [절대값] --> 5(10) -- [2진수] --> 0101(2) -- [2의보수] --> 1011(2)
- 2의 보수 구하기
2의 보수 관계에 있는 두 수를 더하면 자리올림이 발생한다. 이는 계산을 해서 구할 수 있지만 자리수가 많아지면 연산이 어려워진다. 그래서 이보다 쉬운 방법으로 1의 보수에 1을 더한 값을 찾는 방법으로 2의 보수를 구한다. 1의 보수는 0을 1로, 1을 0으로 변환하기만 하면 되기 때문에 구하기 쉽다.
그렇다면 왜 2의 보수가 1의 보수 + 1일까?
1의 보수를 더하면 모든 자리가 1이 된다. 이때 1을 더하게 되면 2의 보수의 값을 더한 것과 같이 자리수가 하나 올라가고 나머지 자리가 0이 되게된다. 글허기 떄문에 2의 보수를 구할때 1의 보수를 구한 뒤 1을 더해주는 방법을 사용하면 된다.
'프로그래밍언어 > JAVA' 카테고리의 다른 글
[JAVA] 형변환 (casting) (0) | 2021.08.03 |
---|---|
[JAVA] 변수 타입 - 기본형 (primitive type) (0) | 2021.08.02 |
[JAVA] 변수의 타입 (0) | 2021.07.29 |
[JAVA] 변수와 상수 (0) | 2021.07.28 |
[JAVA] 자바 개발환경 구축 및 프로그래밍 시작 (0) | 2021.07.27 |