보수(complement)란?

각 진수에서 어떤값을 최대값으로 만들기 위해 보충해주는 수(값)이다.

 

예를 들어, 10진수의 최대값은 10일텐데 3의 보수는 7이 된다.

그리고 컴퓨터에서는 이러한 보수의 개념을 뺄셈 연산을 하기 위해 사용한다.

컴퓨터의 뺄셈에서 사용하는 예를 들면

8비트에서 255 다음은 256이고 컴퓨터는 256이 되면 0으로 초기화하여 다시 카운트 한다는 점을 이해하고

100 - 75 = 25 라는 수식을 컴퓨터 입장에서 만들어보자.

092215_0831_29.png

75의 보수는 255 - 75 = 180 이다.

그래서 100 + 75의 보수(180) 은 280 이고 255를 넘는 부분은 0으로 다시 카운트 되므로 자연스레 초과된 숫자가 뺄셈 결과로 나오게 된다.

280 - 255 = 25 <-- 최종값

컴퓨터는 뺄셈을 못하는 멍청한 기계이기 때문에 위와 같은 오버 카운트 원리를 이용하는 것이다.

보수의 의미는 이정도로 끝

 

그렇다면 1의 보수(one's complement)란?

컴퓨터에서 1의 보수는 2진수 n자리(n비트)에서 2n-1을 기수로 했을때의 보수를 의미한다.

1의 보수라는 용어는 컴퓨터(IT)에서만 사용하는 수학의 개념이기 때문에 사전적인 의미를 찾으면 죄다 IT 백과사전에서만 나온다.

사실 순수 수학에서의 1의 보수에 대한 의미를 파악하려고 무진장 검색했는데 헛고생임을 깨달았다.

1의 보수는 그냥 보수라는 말과 같은 말이다.

 

예를 들어, 0100 1011 이라는 2진수에 대한 1의 보수는 1111 1111 - 0100 1011 = 1011 0100 이 된다.

0100 1011 이라는 2진수의 각자리의 1과 0을 1->0, 0->1 식으로 수치 변환한 것과 같은 결과이다.

여기서, 실질적인 데이터 값은 7비트만 사용이 되고 최상위비트는 + - 부호를 결정하는 부호비트로 사용 된다.

 

그래서 부호비트가 필요없는 unsigned 에서는 1의 보수를 사용하여도 큰 문제가 없지만

signed 에서는 1의 보수를 사용할 경우 0이라는 숫자가

    +0 => 0000 0000

    -0 => 1111 1111 

이렇게 두가지가 있을 수 있기 때문에 컴퓨터에서는 2의 보수를 사용하게 된다. 

 

2의 보수는 1의 보수에서 +1를 한 것이다.

다음의 표와 같다.

 

십진수 이진수 2의 보수
0 0000 0000

0000 0000

(왜냐면 1111 1111 +1)

1 0000 0001 1111 1111

 

1의 보수를 사용 할 땐, 1111 1111 => -0 으로 계산 되는 것이
2의 보수를 사용 하면, 1111 1111 => -1로 계산 되어 진다.
   
이로써, 0이 2개가 반복 되는 것을 피할 수 있다.
대신, 범위는 -128 ~ +127이 된다.

 

최종적으로 컴퓨터에서 2의 보수로 뺄셈 연산 하는 방법이다.

 

양수는 이진수로 표현하고
음수는 2의보수로 표현해서
둘이 더하면 된다. ( 컴퓨터는 덧셈기 뿐 )

 

092215_0831_214.png

 

092215_0831_215.png

 

092215_0831_216.png

 

번호 제목 글쓴이 날짜 조회 수
공지 Software Development Trend (with Java) 황제낙엽 2024.01.19 2912
154 페이스북에서 알게된 AI의 현주소 황제낙엽 2026.05.22 116
153 MIT License 의 AI Coding Agent - Opencode 황제낙엽 2026.01.23 176
152 개발자를 위한 바이브 코딩 추천 툴 7가지 황제낙엽 2025.12.07 192
151 현재 유행하는 AI 들을 이용하는 방법 황제낙엽 2025.01.31 1136
150 SAP GUI AI Agent를 생성했습니다. 황제낙엽 2025.01.12 592
149 프로그래밍에서 polling 의 의미 황제낙엽 2025.01.05 459
148 [Gemini] server 에서 client 의 function call 를 위한 방안과 특징 황제낙엽 2025.01.03 418
147 Gretty 와 Jetty 에 대하여 황제낙엽 2024.11.01 602
146 naver(네이버) developers에서 제공하는 OAuth REST API 관련 링크 황제낙엽 2023.12.31 452
145 (bing) 소프트웨어의 일반적인 버전 관리 규칙 황제낙엽 2023.10.24 456
144 kakao(카카오) developers에서 제공하는 OAuth REST API 관련 링크 황제낙엽 2023.10.22 506
143 식품(상품) 바코드를 조회하여 제품 정보 획득하기 file 황제낙엽 2023.08.07 1454
142 식약처(식품의약품안전처) 공공데이터 API 황제낙엽 2023.08.07 652
141 서비스 이용약관과 개인정보 처리방침 황제낙엽 2023.07.15 446
140 프로젝트 운영 관리 소프트웨어로 100% 자동화된 '데브옵스(DevOps)' 구축하기 (LG CNS) secret 황제낙엽 2023.07.12 65
139 개발자이기 전에 노동자로써의 삶에 대한 고찰 (지극히 개인적인 사설) 황제낙엽 2023.02.28 472
138 [SDC22 키노트 요약정리] 더 쉽게, 끊김 없이 매끄럽게! ‘캄 테크’ 향해 진화하는 미래의 집 황제낙엽 2022.12.24 501
137 변수 네이밍 표기법 종류 file 황제낙엽 2022.11.30 479
136 이미지에서 텍스트를 추출하는 OCR 방법들 file 황제낙엽 2022.09.23 565
135 지수(과학적 표기법, "E") 서식 지정자 (2) 황제낙엽 2021.07.06 495