양수 100은 0x64이다.
메모리에는 64000000로 표시된다. (리틀 엔디안 기준)
그러면 음수 100은 어떻게 저장될까?
음수처리
일단, 음수처리를 하기 위한 단계를 알아보자.
단계 | 액션 | 결과값 |
1 | 양수 100의 값을 비트로 표현하자 | 0b 0110 0100 |
2 | 비트를 반전시키자 | 0b 1001 1011 |
3 | 비트에 +1 하자 | 0b 1001 1100 |
구하고자 하는 숫자의 양수를 비트로 표현한 것을 뒤집고 1을 더하면 구할 수 있다.
이것을 2의 보수라고도 한다.
2의 보수
먼저, 십진수에서 보수를 구해보자.
십진수 3의 보수는 7이다. (10=3+7)
그런데 컴퓨터는 이진수로 이루어져있다.
그래서 2의 보수라고 한다.
2의 보수를 구하는 방식은 음수처리 하는 방식과 동일하다.
이것은 어떤 수의 음수 = 그 수의 2의 보수 라는 의미이다. ( -3 = 3의 2의 보수 )
보수를 위 방식보다 더 간편하게 구하는 방법이 있다.
N: 비트수, M: 값, C: M의 보수값 이라고 할때,
2^(N+1) = M+C
위와 같은 수식으로 C를 간편하게 구할 수 있다.
위와 같은 예시로 100의 2의 보수를 구한다고 해보자.
이때 N: 8, M: 100이 될 것이다.
수식 | 값 |
N | 8 |
M | 100 |
2^(N+1) | 512 |
2^(N+1)-M | 412 |
C (십진수) | 412 |
C (이진수) | 1001 1100 |
계산 결과 위 방식으로 구한 것과 같은 결과가 나온다.
그렇다면 왜 2의 보수를 굳이 어렵게 계산하는 것일까?
2의 보수를 쓰는 장점
뺄셈기를 따로 만들지 않고, 덧셈기를 통해 뺄셈을 할 수 있도록 하기 위함이다.
연산을 하기 위해서는 덧셈기와 뺄셈기가 필요할 것이다.
그렇다 그냥 각각의 로직과 게이트를 만들어서 두가지 연산기를 만들면 되는거다.
그런데, 뺄셈을 덧셈기를 통해서 할 수 있다면?
하나의 로직과 하나의 게이트로 뺄셈이 가능해진다.
즉, 장점을 간단하게 나열해보자면,
1. 뺄셈기 하드웨어를 따로 만들지 않아도된다.
2. 하나만 만들어도 되기 때문에 경제적으로 이득이다.
'임베디드' 카테고리의 다른 글
[비트연산] 특정 위치 비트 set / clear / 반전 (0) | 2022.04.09 |
---|---|
[C언어] 자료형 : float, double, 부동소수점, 고정길이정수 (0) | 2022.04.08 |
[메모리] 빅/리틀 엔디안 (Big/Little-Endian) (0) | 2022.04.05 |
[리눅스] Bash 쉘 프로그래밍 : 입출력, 변수, 주석, if문 (0) | 2022.04.03 |
[리눅스] 쉘 스크립트 : Bash Shell 시작하기, 쉬뱅 (0) | 2022.04.02 |