1의 보수란 어떤 수를 커다란 2의 제곱수-1에서 빼서 얻은 이진수이다. 또는 비트를 반전시켜 얻을수 있다. 1의 보수는 대부분의 산술연산에서 원래 숫자의 음수처럼 취급된다. 주어진 이진수와 자리수가 같고 모든 자리가 1인 수에서 주어진 수를 빼서 얻은 수가 1의 보수이다. 혹은 주어진 이진수의 모든 자리의 숫자를 반전(0을 1로, 1을 0으로)시키면 1의 보수를 얻을 수 있다.


https://ko.wikipedia.org/wiki/1%EC%9D%98_%EB%B3%B4%EC%88%98



그러면 1의 보수를 왜쓰냐!!!!!!!하면!!

음수(-)를 표현해주기 위해서 입니다!

컴퓨터는 숫자를 비트로 나타내자나요!?? 4bit라고 생각했을 때 0001이면 1, 0010이면 2

이런식으로 0000~1111 까지 4비트라면 0~15를 나타낼 수 있습니다.

이런 방식이 흔히 우리가 코딩할 때 쓰는 unsigned 방식입니다. 음수를 나타내지 않는 방식이죠.


int는 32비트이니깐 0 ~ (2의 32승 - 1)까지 나타낼 수 있겠죠????

unsigned에 2의 32승 - 1을 대입하시면 숫자가 망가지지 않는 걸 볼 수 있습니다.


그런데

signed(int앞에 키워드를 안붙여도됨 디폴트 값임)에 2의 32승 -1을 넣으면 깨질까욥 안꺠질까욥?

깨집니다!!!!!!!


이유는 signed를 사용하면 음수 값을 사용할 수 있게 되는데! 32비트개의 비트중 맨 앞에 비트를 음수인지 양수인지 구분하는 비트로 사용하기 때문입니다.

그렇기 때문에 0 ~ (2^32 - 1) 이었던 범위가 ! 반으로 싹 ! 쪼게집니다. 그러면 -(2^31 - 1) ~ (2^31 - 1)까지 표현이 가능합니다!


근데 여기서 1의 보수의 문제점을 발견할 수 있습니다!

무엇이냐!!!!!!

4비트로 예를 들어드릴게요!

4비트를 쭉! 써보겠습니다.

0000

0001

0010

0011

0100

0101

0110

0111

1000

1001

1010

1011

1100

1101

1110

1111


이렇게 16가지의 숫자가있죠! 0에서 15까지!!!!!

근데 우리는 맨앞의 부호를 -로 쓰기로했으니 -7에서 7까지의 숫자가 표현이가능합니다!!!!!

여기서 발생하는 문제는 무엇일까요!?

-7 ~ 7까지의 숫자는 16개가 아니고 15개죠??? 왜일까요????

0이 두번 체크되기 때문인데요


1의 보수는 모든 비트를 반전시키는 것이라고 말씀드렸습니다.


그렇다면 0000을 반전시키면 1111 -> -0 값을 갖는데 -0이라는 숫자는 0과 같죠. 두 번 세줄 필요가 없는 것입니다.

그렇다면 이 문제를 어떻게 해결할까요??


바로!!!!!!!!


2의 보수입니다.!

2의 보수 = 1의 보수 + 1 인데요!!!!!!!!

정의 한번 볼까욥


2의 보수란 어떤 수를 커다란 2의 제곱수에서 빼서 얻은 이진수이다. 2의 보수는 대부분의 산술연산에서 원래 숫자의 음수처럼 취급된다. 주어진 이진수보다 한 자리 높고 가장 높은 자리가 1이며 나머지가 0인 수에서 주어진 수를 빼서 얻은 수가 2의 보수이다. 혹은 주어진 이진수의 모든 자리의 숫자를 반전(0을 1로, 1을 0으로)시킨 뒤 여기에 1을 더하면 2의 보수를 얻을 수 있다.


https://ko.wikipedia.org/wiki/2%EC%9D%98_%EB%B3%B4%EC%88%98


이렇게하면 4비트로 -8부터 7까지 표현이 가능해집니다!


그 이유는 !!!!!

0 ~ 7 까지는 총 8개인데 0 ~ 7 까지를 반전시키면 ! -0 ~ -7에서 -1 ~ -8로 바껴버리지요용!!!!!!!! 그러므로 -8 ~ 7까지 총 16개의 수를 전부 사용할 수 있습니당!!!!!!!!!!!!!

'CS기본지식 > 컴퓨터 기본 지식' 카테고리의 다른 글

rest란??  (0) 2017.11.19

+ Recent posts