sitelink1  
sitelink2  
sitelink3  
sitelink4  
sitelink5  
extra_vars6  

보수(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

 

번호 제목 글쓴이 날짜 조회 수
공지 2023 Software Development Trend 정리 황제낙엽 2024.01.19 1
60 REST API 제대로 알고 사용하기 황제낙엽 2021.06.02 21
59 locale (로캘, 로케일) 황제낙엽 2021.03.19 15
58 [REST API] HTTP METHOD 종류 황제낙엽 2021.01.14 30
57 [Deno] TypeScript를 실행하기 위한 Command-line 런타임 황제낙엽 2021.01.14 8
56 어린이, 청소년용 프로그램 입문 황제낙엽 2017.05.03 69
» 컴퓨터는 음수를 2의 보수법으로 표현한다 file 황제낙엽 2016.10.24 753
54 변수를 unsigned int형 선언 0xffffffff 할당 결과가 -1이 되는 이유는? 황제낙엽 2016.10.24 376
53 0xFFFFFFFF의 값은 왜 -1인가? 황제낙엽 2016.10.24 177
52 unsigned와 signed 황제낙엽 2016.10.24 81
51 컴퓨터와 인간의 대화[20]-전각 문자와 반각 문자 황제낙엽 2016.04.22 122
50 컴퓨터와 인간의 대화[19]-인텔 HEX 황제낙엽 2016.04.22 28
49 컴퓨터와 인간의 대화[18]-베이스64 황제낙엽 2016.04.22 30
48 컴퓨터와 인간의 대화[17]-Surrogate Pair, Supplementary Characters file 황제낙엽 2016.04.22 29
47 컴퓨터와 인간의 대화[16]-UTF-16 황제낙엽 2016.04.22 15
46 컴퓨터와 인간의 대화[15]-UTF-8 황제낙엽 2016.04.22 14
45 컴퓨터와 인간의 대화[14]-euc(Extended UNIX Code) 황제낙엽 2016.04.22 15
44 컴퓨터와 인간의 대화[13]-char set 황제낙엽 2016.04.22 43
43 컴퓨터와 인간의 대화[12]-character encoding 황제낙엽 2016.04.22 10
42 컴퓨터와 인간의 대화[11]-byte 2 황제낙엽 2016.04.22 31
41 컴퓨터와 인간의 대화[10]-byte 1 황제낙엽 2016.04.22 20