일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 자바
- Collection
- Java
- javscript
- DesignPattern
- 람다 칼큘러스
- 스택
- lambda calculus
- Collections
- Rails
- Eclipse
- Network
- Python
- JavaScript
- 로버트마틴
- design-pattern
- 함수형 프로그래밍
- Pattern
- 백준
- 겨울카카오인턴
- functional programming
- 파이썬
- 프로그래머스
- Spring
- 디자인패턴
- exception
- tcp
- solid
- JDBC
- 큐
- Today
- Total
개발자 노트
2의 보수 본문
2의 보수
서론
이번 글에선 2의 보수에 대해 말씀드리려고 합니다.
이렇게~ 간단한 내용을 따로 작성할 필요까지 있나? 의문이 드실 수 있습니다. 하지만, 여러 글들을 봐도 개인적으로 이해 안됬던 부분이 있었습니다.
바로 다음 질문들입니다.
2의 보수가 뭘까?
1의 보수가 뭘까?
보수란 뭘까?
물론, 1의 보수, 2의 보수를 구하는 방법은 널리 알려져 있습니다. 다음처럼 말이죠.
보수 구하기
0110
이라는 2진수가 있을 경우
1의 보수
0110
의 각 자리 수를 모두 flip한 것이 1의 보수이다.
즉, 1001
입니다.
2의 보수
1의 보수에서 1을 더한다.
즉 1010
입니다.
그런데 보수가 뭐길래 위와 같은 과정으로 구한 결과 값이 1의 보수, 2의 보수라고 하는 걸까요?
이번 글에선 이 의문을 해결해보겠습니다.
보수란?
먼저 보수에 대해 알아보겠습니다. 그래야 1의 보수, 2의 보수란 뜻을 알겠지요.
정의
보수란, 보충을 해주는 수를 뜻합니다.
한자로는
- 補數 도울 보, 셈 수 로 나타냅니다
영어로는
- complement로 나타냅니다. 보완하다 라는 뜻을 가지고 있죠
예제
- 1에 대한 10의 보수는 9이다.
- 1에 얼마만큼 숫자를 보충해주어야 10이 될까요?
- 바로 9입니다. 1 + 9 = 10 이니까요.
- 4에 대한 15의 보수는 11이다.
- 4에 얼마만큼 숫자를 보충해주어야 15가 될까요?
- 바로 11입니다. 4 + 11 = 15 이니까요.
다시 1의 보수를 알아보자
2진수에서 1의 보수를 다시 살펴보겠습니다.
0110
에 대한 1의 보수는 위에서 보시다시피 1001
입니다.
그렇다면 위에서 살펴본대로 예제 대로 0110
+ 1001
= 1 이 되어야 하지 않을까요?
그런데 더해보면 1111
이 됩니다!
앞서 살펴본 정의와 맞지 않다는 것이죠. 여기서 대혼동이 왔습니다만! 1의 보수란 단어에 오해가 있었습니다…
1들의 보수
영어로 1의 보수를 어떻게 표현하면요…
ones’ complement
입니다.
영어에서는 -s’s가 되면 '
의 뒤를 지우므로, ones’s
complement 라는 겁니다.
1의 보수에 대한 영어 위키를 참조하시면… 다음과 같이 말을 합니다.
"ones' complement" (note this is possessive of the plural "ones", not of a singular "one")
소괄호로 명시하고 있습니다. 단수 one이 아니라, 복수형으로 표현했다고요
그렇기 때문에 4자리 수인 경우 1들의 나열은 1111
입니다.
그렇기 때문에 0110
에 대한 1들의 보수는 1001
였던 것이죠.
그렇기 때문에 0110
과 1001
을 더하면 1111
이 됬던 겁니다.
그렇기 때문에 1들의 보수를 구하는 방법은 0110
을 flip하는 것 이였습니다.
다시 2의 보수를 알아보자.
그럼 2의 보수는 어떻게 된 걸까요? 왜 1의 보수에 1을 더하면 2의 보수가 될까요??
0110
의 1의 보수인 1001
에서 1을 더하면 1010
입니다.
그리고 0110
+ 1010
= 10000
이죠.
2의 보수라면 2가 나와야 하는데, 2^4인 16이 나옵니다.
radix complement로써 2의 보수
이것 또한 영어 위키를 참조해보겠습니다.
Two's complement is an example of a radix complement. The 'two' in the name refers to the term which, expanded fully in an N-bit system, is actually "two to the power of N" - 2^N
2의 보수란, radix complement의 한 예시로 two라는 용어는 N-bit 시스템에서 완전히 확장되어 실제로는 2^N
을 의미한다.
위키의 말에 따르면
0110
은 4비트 이므로, N = 4가 되어 2의 보수란 2^4의 보수를 의미하게 됩니다.
따라서, (2^4)의 보수는 1010
이였던 것이죠. 0110
+ 1010
= 10000
= 16(10 진수) 인 겁니다.
그리고 위와 같기 때문에 1의 보수에 1을 더하면 2의 보수가 됬던 것이죠.
컴퓨터의 음수
그럼 2의 보수가 음수로 채택된 이유도 자연스레 납득이 갑니다. 컴퓨터의 음수를 구현하는데는 다음 제약사항이 존재합니다.
- 컴퓨터에서는 0과 1로 이루어진 비트로만 음수를 표현을 해야 합니다.
- 컴퓨터는 덧셈만 수행합니다.
- 양수 그리고 양수와 크기가 같은 음수를 더하면 0이 되어야 합니다. (ex 10 + (-10) = 0)
위 예제인 0110
을 기준으로..
0 | 1 | 1 | 0 | |
---|---|---|---|---|
+ | ㅁ | ㅁ | ㅁ | ㅁ |
0 | 0 | 0 | 0 |
음수라고 표현할 수 있는 ㅁㅁㅁㅁ
를 더하면 0000
이 되어야 한다는 것입니다. 0110에서 수를 더하면 값이 커지면 커졌지 어떻게 0000이 될 수 있을까요?
바로~ 컴퓨터는 올림수를 버릴 수 있다는 것을 떠올리시면 됩니다.
0000
을 10000
으로 본다면
ㅁㅁㅁㅁ
를 결정할 수 있지 않겠나요?
0 | 1 | 1 | 0 | ||
---|---|---|---|---|---|
+ | ㅁ | ㅁ | ㅁ | ㅁ | |
1 | 0 | 0 | 0 | 0 |
여기서 올림수인 1 은 버리는 거죠.
그렇기에 0110
에 대한 2(10000
)의 보수인 1010
을 음수로 결정하는 것입니다.
그래서 이 둘을 더하면 0000
이 나오는 것이죠. 바로 0이요!
'일반적인 IT주제' 카테고리의 다른 글
비동기 프로그래밍 - 정리 (0) | 2022.08.29 |
---|---|
expression과 evaluation이란? (0) | 2020.11.10 |
[DDNS]iptime 서버 주소 등록 (0) | 2020.04.20 |
UI와 API에 대하여 (0) | 2020.03.12 |