“2의 보완”이란 무엇입니까?


434

저는 컴퓨터 시스템 과정을 겪고 있으며 부분적으로 Two 's Complement 와 함께 고심 하고 있습니다 . 나는 그것을 이해하고 싶지만 내가 읽은 모든 것이 그림을 함께 가져 오지 못했습니다. 나는 wikipedia 기사나의 교과서를 포함한 다양한 다른 기사들을 읽었다 .

따라서이 커뮤니티 wiki 게시물 을 시작하여 Two 's Complement의 정의, 사용 방법 및 캐스트 (서명에서 서명되지 않은 것으로 또는 그 반대로), 비트 단위 연산 및 비트 시프트 연산과 같은 연산 중 숫자에 영향을 줄 수있는 방법을 정의하고 싶었 습니다. .

내가 기대 하는 것은 프로그래머가 쉽게 이해할 수 있는 명확하고 간결한 정의 입니다.

답변:


627

2의 보수는 정수를 저장하는 영리한 방법이므로 일반적인 수학 문제를 구현하기가 매우 간단합니다.

이해하려면 숫자를 이진수로 생각해야합니다.

기본적으로 말합니다

  • 0의 경우 모두 0을 사용하십시오.
  • 양의 정수의 경우 최대 2 (비트 수 -1 ) -1로 카운트 업을 시작합니다 .
  • 음의 정수의 경우 정확히 동일한 작업을 수행하되 0과 1의 역할을 전환하십시오 (따라서 0000으로 시작하는 대신 1111로 시작- "보완"부분).

의 4 비트의 미니 바이트를 시도하자 (우리는 그것을 전화 할게 니블 - 1/2 바이트).

  • 0000 -제로
  • 0001 -하나
  • 0010 -두
  • 0011 -세
  • 01000111 4 ~ 7

그것은 우리가 긍정적으로 갈 수있는 한입니다. 2 3 -1 = 7.

부정의 경우 :

  • 1111 -부정적인 것
  • 1110 -음수 2
  • 1101 -부정적인 세
  • 11001000 - 음의 팔에 부정적인 네

1000긍정이 아닌 긍정에 대한 하나의 추가 값 ( = -8)을 얻습니다 . 00000이 사용 되기 때문 입니다. 이것은 번호 라인 으로 간주 될 수 있습니다 컴퓨터 있습니다.

양수와 음수 구별

이렇게하면 첫 번째 비트는 음이 아닌 값과 음의 10 진수 값을 구분하는 데 사용할 수 있으므로 "부호"비트의 역할을합니다. 최상위 비트가 1인 경우 이진은 음수라고 할 수 있습니다. 여기서 최상위 비트 (가장 왼쪽)는0 10 진수 값이 음수가 아닌 말할 수 있습니다.

"1의 보수"음수는 부호 비트를 뒤집은 다음 0부터 카운트합니다. 그러나이 방법은 1000"음의 0" 으로 해석 하여 혼동됩니다. 일반적으로 하드웨어 가까이에서 작업 할 때이 문제 만 걱정하면됩니다.


146
아마도 2의 보수의 가장 좋은 부분은 수학을 단순화하는 방법입니다. 추가 시도 2 (0010) -2 (1110) 함께 그 결과 실제로 거의 마술 같은 0000, 2 + -2 = 0, 그래서 당신은 가장 중요한 비트가 오버플로 10000을 얻을
Naaff

96
쉬운 덧셈과 뺄셈 외에 또 다른 장점은 2의 보수에 0이 하나만 있다는 것입니다. +1을 나타 내기 위해 0001을 사용하고 -1을 나타 내기 위해 1001을 사용하는 것과 같이 간단한 부호 비트를 사용하는 경우 0000 ( "+ 0") 및 1000 ( "-0")의 두 가지 0이 있습니다. 그것은 뒤에 진짜 고통입니다.
Jörg W Mittag 2016 년

26
그것이 음수 값과 양수 값의 범위가 더 큰 이유를 설명하기 위해지지하십시오. 나는 범위 차이의 이유를 찾고왔다.
Ashwin

2
"음의 정수의 경우, 정확히 같은 일을하되 카운트 다운하고 0과 1의 역할을 바꾸십시오"
Koray Tugay

1
. 비트를 음의 정수로 변환하는 추가 부분이 추가되었습니다.
Suraj Jain

339

Wikipedia 기사보다 더 잘 설명 될 수 있는지 궁금합니다.

2의 보수 표현으로 해결하려는 기본 문제는 음수를 저장하는 문제입니다.

먼저 4 비트에 저장된 부호없는 정수를 고려하십시오. 당신은 다음을 가질 수 있습니다

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

이들은 부정인지 긍정적인지에 대한 표시가 없기 때문에 서명되지 않습니다.

부호 크기 및 초과 표기법

음수를 저장하려면 여러 가지를 시도 할 수 있습니다. 먼저, 첫 번째 비트를 +/-를 나타내는 기호 비트로 할당하고 나머지 비트는 크기를 나타내는 부호 크기 표기법을 사용할 수 있습니다. 따라서 4 비트를 다시 사용하고 1은-를 의미하고 0은 +를 의미한다고 가정하면

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

그래서 거기에 문제가 있습니까? 우리는 0과 0을가집니다. 더 큰 문제는 이진수를 더하고 빼는 것입니다. 부호 크기를 사용하여 더하고 빼는 회로는 매우 복잡합니다.

뭐가

0010
1001 +
----

?

다른 시스템은 초과 표기법입니다 입니다. 음수를 저장할 수 있으며 두 개의 0 문제를 제거하지만 덧셈과 뺄셈은 여전히 ​​어렵습니다.

따라서 2의 보수가 온다. 이제 양수와 음수를 저장하고 비교적 쉽게 산술을 수행 할 수 있습니다. 숫자를 2의 보수로 변환하는 방법에는 여러 가지가 있습니다. 여기 하나 있습니다.

10 진수를 2의 보수로 변환

  1. 숫자를 이진수로 변환하십시오 (지금은 부호 무시). 예를 들어 5는 0101이고 -5는 0101입니다.

  2. 숫자가 양수이면 완료됩니다. 예를 들어 5는 2의 보수 표기법을 사용하여 이진수로 0101입니다.

  3. 숫자가 음수이면

    3.1 보수를 찾으십시오 (0과 1을 반전하십시오). 예를 들어 -5는 0101이므로 보수를 찾는 것은 1010입니다.

    3.2 보수 1010 + 1 = 1011에 1을 더합니다. 따라서 2의 보수에서 -5는 1011입니다.

바이너리에서 2 + (-3)을 원한다면 어떻게해야합니까? 2 + (-3)은 -1입니다. 부호 크기를 사용하여이 숫자를 추가하려면 어떻게해야합니까? 0010 + 1101 =?

2의 보수를 사용하면 얼마나 쉬운 지 고려하십시오.

 2  =  0010
 -3 =  1101 +
 -------------
 -1 =  1111

2의 보수를 10 진수로 변환

1111을 10 진수로 변환 :

  1. 숫자는 1로 시작하므로 음수이므로 1111의 보수 인 0000을 찾습니다.

  2. 1을 0000에 더하면 0001이됩니다.

  3. 0001을 10 진수 1로 변환합니다.

  4. 부호 = -1을 적용하십시오.

타다!


45
내 의견으로는 가장 좋은 답변입니다.
Koray Tugay

5
네, 이것은 매우 간단하고 문제를 아주 잘 설명합니다
Max Koretskyi

3
두 가지 방법으로 변환 할 때 하나를 추가하면 항상 같은 숫자가되는 방법을 이해하지 못합니다. 내 마음에 당신은 단계를 되돌 리거나 하나 또는 다른 것을 빼고 싶습니다.
Marcos Pereira

2
보완에 1을 더해야하는 이유는 무엇입니까?
Zinan Xing 2016

4
이 답변은 Wikipedia에서 사용해야합니다.
히로키

119

내가 본 대부분의 설명과 마찬가지로 위의 설명은 2의 보수로 작업하는 방법에 대해 분명하지만 실제로 무엇인지 설명하지는 않습니다. 수학적으로. 나는 적어도 정수에 대해 그렇게하려고 노력할 것이고 아마도 아마도 가장 친숙한 배경을 다룰 것입니다.

그것은 소수점 작동 방법 리콜 :
  2345
작성하는 방법이다
  2 × 10 3 + 3 × 10 2 + 4 × 10 1 + 5 × 10 0 .

같은 방법으로 이진수는 숫자를 쓰는 방법입니다. 같은 일반적인 생각에 따라 01 하지만 10을 2로 바꾸는 방법입니다. 그런 다음 이진수로
  1111

  1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0 을 쓰는 방법이며
, 해결하면 15 (기본 10)와 같습니다.
  8 + 4 + 2 + 1 = 15 이기 때문입니다 .

이것은 모두 양수에 적합합니다. 인간이 10 진수로하기 때문에 마이너스 부호를 붙이려는 경우 음수에도 적용됩니다. 그것은 컴퓨터에서도 가능하지만 1970 년대 초반부터 그런 컴퓨터를 보지 못했습니다. 나는 다른 토론의 이유를 남길 것입니다.

컴퓨터의 경우 음수에 대한 보수 표현 을 사용하는 것이 더 효율적 입니다. 그리고 여기 종종 간과되는 것이 있습니다. 보수 표기법에는 숫자의 숫자에 대한 반전이 포함됩니다. 심지어 정상적인 양수 앞에 오는 암시 적 제로도 포함됩니다. 문제가 발생하기 때문에 어색합니다. 고려할 무한 자릿수 일 수 있습니다.

다행히 컴퓨터는 무한대를 나타내지 않습니다. 숫자는 특정 길이 (또는 원하는 경우 너비)로 제한됩니다. 양의 이진수로 돌아가지만 특정 크기로 돌아가 봅시다. 이 예제에서는 8 자리 ( "비트")를 사용합니다. 따라서 이진수는
  00001111
또는
  0 × 2 7 + 0 × 2 6입니다. + 0 × 2 5 + 0 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0입니다.

2의 보수 음수를 형성하기 위해 먼저 모든 (이진수) 숫자를 보완하여
  11110000 을 형성
하고 1을 추가하여 11110001 을 형성
  합니다.
하지만 -15를 의미한다는 것을 어떻게 이해해야합니까?

답은 상위 비트 (가장 왼쪽 비트)의 의미를 변경한다는 것입니다. 이 비트는 모든 음수에 대해 1 이됩니다. 변화는이에 표시되는 숫자의 값에 기여의 부호를 변경하는 것입니다 그래서 지금 우리. 11110001가 대표하는 이해된다
  - 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + 0 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0
해당 표현 앞에 "-"가 표시되어 있습니까? 부호 비트는 가중치 -2 7 , 즉 -128 (기본 10)을 지니고 있음을 의미합니다 . 다른 모든 위치는 부호없는 이진수에서와 동일한 가중치를 유지합니다.

-15를 계산하면
  -128 + 64 + 32 + 16 + 1
입니다. 계산기에서 사용해보십시오. -15입니다.

컴퓨터에서 음수를 나타내는 세 가지 주요 방법 중 2의 보수는 일반적인 사용 편의성을 위해 손을 down습니다. 그러나 이상한 점이 있습니다. 바이너리이기 때문에 가능한 많은 비트 조합이 있어야합니다. 각 양수는 음수와 쌍을 이룰 수 있지만 0은 하나뿐입니다. 0을 부정하면 0이됩니다. 따라서 부호 비트에 1 이 있고 다른 곳에 0이 있는 숫자가 하나 더 있습니다. 해당 양수는 사용중인 비트 수에 맞지 않습니다.

이 숫자에 대해 더 이상한 점은 1을 보완하고 추가하여 양수를 만들려고하면 동일한 음수를 다시 얻는다는 것입니다. 제로가 이것을하는 것은 당연한 것처럼 보이지만 이것은 예상치 못한 일이며 컴퓨터를 제외하고는 일반적으로 고정 길이 산술이 아니라 무제한의 자릿수 공급을 생각하기 때문에 우리가 익숙한 행동이 아닙니다.

이것은 이상한 빙산의 일각과 같습니다. 수면 아래에 더 많은 거짓말이 있지만, 이것으로 충분합니다. 고정 소수점 산술에 대해 "오버플로"를 연구하면 더 많은 것을 찾을 수 있습니다. 당신이 정말로 그것에 들어가기를 원한다면, 당신은 또한 "모듈 식 산술"을 연구 할 것입니다.


1
나는이 대답을 좋아한다! 2를 보완하고 하나를 추가하는 방법을 설명합니다.
SJ.

이 답변도 마음에 듭니다. 특히 음수를 나타내는 방법을 보여줍니다. 여기서 나는 MSB뿐만 아니라 정수가 거꾸로되어 다른 가중치 값을 다시 추가했다고 생각했습니다. 고마워, 이것은 나의 두뇌 블록을 해결
user188757

역수가없는 홀수 볼 수를 언급하는 것이 좋습니다. 그러나 우리는 이것에 대해 무엇을합니까? 누군가 오버플로 플래그를 뒤집으려고 할 때 방금 플래그를 설정합니까?
NH.

다른 답변은 "어떻게"에 초점을 맞추고 있지만,이 답변은 "왜"를 부드럽게 안내합니다. 그것은 나를 도왔다. 감사!
Abhishek Pathak

숫자가 11000 ... 000으로 끝나면 반전하면 01000 ... 000이됩니다. 2의 보수 표기법은 가장 왼쪽에 표시된 숫자의 왼쪽에있는 모든 숫자가 해당 숫자와 같은 값을 가져야하지만, 표현이 1000 ... 000 인 숫자를 뒤집을 때 사실이 아님을 기반으로합니다.
supercat

20

2의 보수는 이진 값을 찾는 데 매우 유용하지만 그러한 문제를 해결하는 훨씬 더 간결한 방법을 생각했습니다 (다른 사람이 그것을 게시하지는 않음).

2 진을 예로들 수 있습니다 (예 : 1101). "공간"1 "이 부호라고 가정하고 -3 과 같습니다 .

2의 보수를 사용하면 다음과 같이 할 수 있습니다 ... 1101에서 0010으로 뒤집기 ... 0001 + 0010 ===> 추가하면 양수 이진수 = 3으로 0011. 0011이됩니다. 따라서 1101 = -3 !

내가 깨달은 것 :

모든 뒤집기와 덧셈 대신에, 당신은 (2 3 * 0) + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = 5.

부정적으로 동일한 개념을 정확하게 수행하십시오!

예를 들어 1101을 사용하십시오.

2 3 * 1 = 8 대신 첫 번째 숫자의 경우 -(2 3 * 1) = -8 .

그런 다음 평소대로 계속해서 -8 + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = -3


1
가장 좋은 방법은 2의 보수를 이해할 수 있습니다. 이것을 읽은 후 위의 질문에 대한 모든 대답을 이해할 수있었습니다.
Shakeel Shahzad

1
이 방법은 Computer Systems : A programmer 's perspective 책에 언급되어 있습니다.
jimo

1
이것은 훨씬 빠른 방법입니다!
chanzerre

14

당신이 유한 한 수의 비트 / 트릿 / 숫자 / 무엇을 가지고 있다고 상상해보십시오. 모든 숫자를 0으로 0을 정의하고 자연스럽게 위쪽으로 계산합니다.

00
01
02
..

결국 오버플로됩니다.

98
99
00

우리는 두 자리 숫자를 가지고 있으며 0에서 100까지의 모든 숫자를 나타낼 수 있습니다. 모든 숫자는 양수입니다! 음수도 표현하고 싶다고 가정 해 봅시다.

우리가 실제로 가진 것은주기입니다. 2 앞의 숫자는 1입니다. 1 앞의 숫자는 0 입니다. 0 앞의 숫자는 ... 99 입니다.

간단하게하기 위해 50을 초과하는 숫자는 음수라고 가정하겠습니다. "0"내지 "49"는 0 내지 49를 나타낸다. "99"는 -1이고, "98"은 -2이고, "50"은 -50이다.

이 표현은 10의 보수 입니다. 컴퓨터는 일반적으로 숫자 대신 비트를 사용하는 것을 제외하고는 2의 보수를 사용합니다.

10의 보수에 대한 좋은 점은 추가 가 작동 한다는 것 입니다. 양수와 음수를 추가하기 위해 특별한 작업을 수행 할 필요는 없습니다!


9

주행 거리계를 비유로 사용하여 jng의 Reddit 에 대한 환상적인 설명 읽었습니다 .

여기에 이미지 설명을 입력하십시오

유용한 규칙입니다. 이진수로 양수를 더하거나 빼는 동일한 회로와 논리 연산은 규칙을 사용하는 경우 여전히 양수와 음수 모두에서 작동하므로 유용하고 전지구 적입니다.

자동차의 주행 거리계를 상상해보십시오 (예 : 99999). 롤링하면 00000이됩니다. 00000을 줄이면 99999가됩니다 (롤 주위로 인해). 99999에 1을 다시 추가하면 00000으로 돌아갑니다. 따라서 99999가 -1을 나타내는 것으로 결정하는 것이 좋습니다. 마찬가지로 99998이 -2 등을 나타내는 것으로 결정하는 것이 매우 유용합니다. 어딘가에서 멈추어야하며, 또한 규칙에 따라 숫자의 상위 절반은 음수 (50000-99999)로 간주되며 아래쪽 절반은 양수로 나타납니다 (00000-49999). 결과적으로 상위 숫자 5-9는 표현 된 숫자가 음수를 의미하고 0-4는 표현이 양수를 의미합니다. 2의 보수 이진수의 부호를 나타내는 최상위 비트와 정확히 동일합니다.

이것을 이해하는 것도 나에게 어려웠다. 일단 그것을 얻었고 책 기사와 설명을 다시 읽게되자 (그 당시에는 인터넷이 없었습니다), 그것을 설명하지 않는 사람들이 실제로 그것을 이해하지 못했다는 것이 밝혀졌습니다. 그 후 어셈블리 언어를 가르치는 책을 썼습니다 (10 년 동안 꽤 잘 팔렸습니다).


5

주어진 수의 1에서 1까지의 보수를 추가하여 2 개의 보수가 발견됩니다. 우리의 보완의 보수를 찾을 수있다 말할 수 있습니다 10101, 다음 자사의 것들을 보완을 찾을 01010추가 1이며,이 결과로 01010+1=01011, 최종적인 해답이다.


4

8 비트를 사용하여 이진 형태로 답변 10 – 12를 얻도록하겠습니다. 실제로 할 일은 10 + (-12)입니다.

10에서 빼려면 12의 칭찬 부분을 가져와야합니다. 이진수 12는 00001100입니다. 이진수 10은 00001010입니다.

12의 칭찬 부분을 얻으려면 우리는 모든 비트를 뒤집은 다음 1을 더합니다. 이진수의 역수는 11110011입니다. 이것은 또한 역 코드입니다 (1의 보수). 이제 하나를 추가해야합니다. 이제 11110100입니다.

11110100은 12의 칭찬입니다! 이런 식으로 생각하면 쉽습니다.

이제 10-12의 위의 질문을 이진 형식으로 해결할 수 있습니다.

00001010
11110100
-----------------
11111110  

3

2의 보수 : 숫자의 1의 보수로 1을 더하면 2의 보수가됩니다. 예를 들어 100101은 1의 보수는 011010이고 2의 보수는 011010 + 1 = 011011입니다 (1의 보수를 가진 것을 추가함으로써) 자세한 내용은 이 기사에서이를 그래픽으로 설명합니다.


plus1 원과 설명을 가지고 링크
Manohar 레디 Poreddy

3

수학 관점에서이 2의 보수 시스템을 보면 실제로 의미가 있습니다. 10의 보수에서 아이디어는 본질적으로 차이를 '분리'하는 것입니다.

예 : 63-24 = x

우리는 24의 보수를 실제로 추가합니다 (100-24). 실제로 우리가하는 일은 방정식의 양변에 100을 더하는 것입니다.

이제 방정식은 100 + 63-24 = x + 100입니다. 그래서 우리는 100 (또는 10 또는 1000 또는 그 밖의 것)을 제거합니다.

긴 제로 체인에서 하나의 숫자를 빼야하는 불편한 상황으로 인해, 우리는 십진수 시스템에서 9의 보수 인 '감소 기수 보수'시스템을 사용합니다.

우리가 9의 큰 체인에서 빼는 숫자가 표시되면 숫자를 반대로 바꾸면됩니다.

예 : 99999-03275 = 96724

이것이 9의 보수 뒤에 1을 더하는 이유입니다. 어릴 적 수학에서 알 수 있듯이 9는 '훔치기'1로 10이됩니다. 따라서 기본적으로 차이에서 1을 취하는 10의 보수입니다.

이항에서 2의 보수는 10의 보수와 같고 1의 보수는 9의 보수에 해당합니다. 가장 큰 차이점은 10의 거듭 제곱 (10, 100 등을 방정식에 더함)으로 차이를 분리하려고하는 대신 2의 거듭 제곱으로 차이를 분리하려고한다는 것입니다.

이러한 이유로 우리는 비트를 반전시킵니다. 우리의 minuend가 십진수 9의 사슬 인 것처럼, minuend는 이진수의 사슬입니다.

예 : 111111-101001 = 010110

1의 사슬은 2의 좋은 거듭 제곱 아래 1이므로, 10의 9와 같은 차이에서 1을 훔칩니다.

음의 이진수를 사용할 때 실제로 다음과 같이 말합니다.

0000-0101 = x

1111-0101 = 1010

1111 + 0000-0101 = x + 1111

x를 '격리'하기 위해서는 1111이 10000에서 1이 아니기 때문에 1을 더해야합니다. 그리고 1을 원래 차이에 추가했기 때문에 선행 1을 제거했습니다.

1111 + 1 + 0000-0101 = x + 1111 + 1

10000 + 0000-0101 = x + 10000

x를 얻기 위해 양쪽에서 10000을 제거하면 기본 대수입니다.


3

지금까지 많은 답변이 왜 2의 보수가 음수를 나타내는 데 사용되는지를 잘 설명하지만 2의 보수가 무엇인지, 특히 '1'이 왜 추가되는지, 실제로 종종 잘못된 방식으로 추가되는 이유는 알려주지 않습니다.

혼동은 보수 수의 정의에 대한 이해가 부족하기 때문에 발생합니다. 보완은 무언가를 완성시키는 누락 된 부분입니다.

기수 b의 n 자리 숫자 x의 기수 보수는 정의상 b ^ nx입니다. 이진수에서 4는 100으로 표시되며 3 자리 (n = 3)와 기수 2 (b = 2)를 갖습니다. 따라서 기수 보완은 b ^ nx = 2 ^ 3-4 = 8-4 = 4 (또는 이진수 100)입니다.

그러나 이진수에서 기수의 보수를 얻는 것은 기수 보수의 1보다 작은 (b ^ n-1) -y로 정의 된 감소 된 기수 보수를 얻는 것만 큼 쉽지 않습니다. 기수를 줄이려면 모든 숫자를 뒤집기 만하면됩니다.

100-> 011 (감소 된 (1) 기수 보완)

기수 (2) 보수를 얻기 위해 정의 된대로 간단히 1을 추가합니다.

011 +1-> 100 (2의 보수).

이제이 새로운 이해를 통해 Vincent Ramdhanie의 예를 살펴 보겠습니다 (위의 두 번째 응답 참조).

/ * Vincent의 시작

1111을 10 진수로 변환 :

숫자는 1로 시작하므로 음수이므로 1111의 보수 인 0000을 찾습니다. 1을 0000에 더하고 0001을 구합니다. 0001을 10 진수로 변환합니다. 1을 부호 = -1로 적용합니다. 타다!

빈센트의 끝 * /

다음과 같이 이해되어야한다

숫자는 1로 시작하므로 음수입니다. 그래서 우리는 그것이 값 x의 2의 보수임을 알고 있습니다. 2의 보수로 표시되는 x를 찾으려면 먼저 1의 보수를 찾아야합니다.

x의 1의 보수 : 1111 x의 2의 보수 : 1111-1-> 1110; x = 0001 (모든 숫자 뒤집기)

부호를 적용하고 답은 = -x = -1입니다.


3

보완이라는 단어는 완전성에서 파생됩니다. 10 진 세계에서 숫자 0-9는 모든 10 진수를 표현하기 위해 숫자 또는 숫자의 보수 (완전한 세트)를 제공 합니다. 이진 세계에서, 숫자 0 및 1은 모든 이진수를 표현하기위한 숫자 의 보수 를 제공한다 . 실제로 기호 0과 1은 모든 것 (텍스트, 이미지 등)은 물론 양수 (0)와 음수 (1)를 나타내는 데 사용해야합니다. 우리 세계에서 숫자 왼쪽의 공백은 0으로 간주됩니다.

                  35=035=000000035.

컴퓨터 저장 위치에는 빈 공간이 없습니다. 모든 비트 (이진수)는 0 또는 1이어야합니다. 메모리를 효율적으로 사용하려면 8 비트, 16 비트, 32 비트, 64 비트, 128 비트 표현으로 저장할 수 있습니다. 8 비트 숫자로 저장된 숫자가 16 비트 위치로 전송 될 때 부호와 크기 (절대 값)는 동일하게 유지되어야합니다. 1의 보수와 2의 보수 표현이이를 용이하게합니다. 명사 : 1의 보수와 2의 보수는 모두 최상위 비트 (왼쪽에있는 비트)가 부호 비트 인 부호있는 수량의 이진 표현입니다. 0은 양수이고 1은 음수입니다. 2s 보수는 음을 의미하지 않습니다. 서명 된 수량을 의미합니다. 10 진수와 같이 크기는 양수로 표시됩니다. 이 구조는 부호 확장을 사용하여 더 많은 비트가있는 레지스터 []로 승격 할 때 수량을 유지합니다.

       [0101]=[00101]=[00000000000101]=5 (base 10)
       [1011]=[11011]=[11111111111011]=-5(base 10)

동사로서 : 2의 보수는 부정 하는 것을 의미 합니다 . 부정적이라는 의미는 아닙니다. 부정적인 경우 긍정적 인 의미; 긍정적 인 경우 부정적인. 크기는 절대 값입니다.

        if a >= 0 then |a| = a
        if a < 0 then |a| = -a = 2scomplement of a

이 기능은 부정 다음 더하기를 사용하여 효율적인 이진 빼기를 허용합니다. a-b = a + (-b)

1의 보수를 취하는 공식적인 방법은 각 숫자가 1에서 값을 빼는 것입니다.

        1'scomp(0101) = 1010.

이것은 각 비트를 개별적으로 뒤집거나 뒤집는 것과 같습니다. 이로 인해 음수가 0이되고 잘 사랑하지 않으므로 te 1의 보수에 1을 추가하면 문제가 해결됩니다. 2의 보수를 부정하거나 취하려면 먼저 1의 보수를 취한 다음 1을 더하십시오.

        Example 1                             Example 2
         0101  --original number              1101
         1's comp  1010                       0010
         add 1     0001                       0001
         2's comp  1011  --negated number     0011

예제에서 부정은 부호 확장 된 숫자와 함께 작동합니다.

추가 :
1110 캐리 111110 캐리 0110은 000110과 동일합니다. 1111 111111 합계 0101 합계 000101

요약 :

    1110  Carry                      00000   Carry
     0110          is the same as     00110
    -0111                            +11001
  ----------                        ----------
sum  0101                       sum   11111

2의 보수로 작업 할 때 숫자 왼쪽의 공백은 양수의 경우 0으로 채워지지만 음수의 경우 1로 채워집니다. 캐리는 항상 추가되며 1 또는 0이어야합니다.

건배


3

2의 보수는 본질적으로 2 진수의 역수를 더하는 방법입니다. 자신에게 물어보십시오 : 이진 형식의 숫자가 주어지면 원래 숫자에 추가 될 때 어떤 비트 패턴이 결과를 0으로 만들까요? 이 비트 패턴을 생각해 낼 수 있다면 해당 비트 패턴은 원래 숫자의 -ve 표현 (가산 역)입니다. 정의에 따라 첨가 역수에 숫자를 추가하면 항상 0이되어야합니다. 예 : 10을 5로하는 101을 가져 오십시오. 이제 주어진 비트 패턴 (101)에 추가 될 때 0이되는 비트 패턴을 생성해야합니다. 그렇게하려면 가장 오른쪽 101 비트부터 시작하여 개별 비트마다 다시 같은 질문을하십시오. 결과를 0으로 만들기 위해 "this"비트에 어떤 비트를 추가해야합니까? 일반적인 이월을 고려하여 계속 진행하십시오. 가장 오른쪽에있는 3 곳 (앞의 0과 관계없이 원래 숫자를 정의하는 숫자)을 마친 후 마지막 캐리는 가산의 비트 패턴으로 반전됩니다. 또한, 우리는 단일 바이트에서 원래의 숫자를 붙잡을 수 있기 때문에, 첨가제 역의 다른 모든 선행 비트도 1이어야합니다. 그래서 컴퓨터가 "that"저장 유형 (char)을 사용하여 숫자와 그 첨가제의 역수를 더할 때 해당 문자의 결과는 모두 0입니다.

 1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0

2

lavinio의 답변이 마음에 들었지만 비트를 이동하면 약간의 복잡성이 추가됩니다. 부호 비트를 존중하는 동안 또는 부호 비트를 존중하지 않는 동안 종종 이동 비트를 선택할 수 있습니다. 숫자를 부호있는 것으로 처리 (니블의 경우 8-7, 바이트의 경우 -128-127) 또는 전체 범위의 부호없는 숫자 (니블의 경우 0-15, 바이트의 경우 0-255) 중에서 선택합니다.


2

데이터 유형의 비트 조합 중 약 절반이 음의 정수로 예약되어 음의 정수를 대부분의 음의 정수로 추가하면 캐리 오버플로가 발생하는 방식으로 음의 정수를 인코딩하는 영리한 수단입니다. 결과는 이진 0이됩니다.

따라서 2의 보수에서 1이 0x0001이면 -1은 0x1111입니다. 그 결과 합은 0x0000 (오버플로 1)이됩니다.


1

몇 주 전에 같은 문제가있었습니다. 나는 다양한 출처에서 온라인으로 그것에 대해 읽고, 조각을 모 으려고 노력했으며, 내가 올바르게 이해했는지 확인하기 위해 직접 글을 썼습니다. 우리는 주로 두 가지 이유로 2의 보수를 사용합니다.

  1. 0의 여러 표현을 피하려면
  2. 오버플로 발생시 캐리 비트를 추적하지 않습니다 (보완에서와 같이).
  3. 더하기 및 빼기와 같은 간단한 연산을 수행하는 것이 쉬워집니다.

당면한 문제에 대한 자세한 설명을 원하면 여기에서 작성한 기사를 사용해보십시오 . 그것이 도움이되기를 바랍니다!


1

2의 보수는 음수를 표현하는 방법 중 하나이며 대부분의 컨트롤러와 프로세서는 2의 보수 형태로 음수를 저장합니다


1
이것은 다른 답변에서 제공 한 정보에 아무것도 추가하지 않습니다.
Adrian Mole

0

참조 : https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

모든 비트를 반전시키고 1을 프로그래밍 방식으로 추가합니다.

  // in C++11
  int _powers[] = {
      1,
      2,
      4,
      8,
      16,
      32,
      64,
      128
  };

  int value=3;
  int n_bits=4;
  int twos_complement = (value ^ ( _powers[n_bits]-1)) + 1;

어셈블러조차도 너무 높은 수준입니다. 추가 로직의 게이트 레벨 회로도를 볼 필요가 있습니다. T 사이클로. 알고리즘 적으로 정확합니다.
mckenzm

0

주어진 숫자의 2의 보수는 아니오입니다. 1을 1의 보수에 추가하여 얻습니다. 이진수가 있다고 가정합니다. : 10111001101 1의 보수는 다음과 같습니다 : 01000110010 2의 보수는 다음과 같습니다 : 01000110011


0

숫자를 비트 단위로 보완하는 것은 숫자를 모두 뒤집는 것입니다. 2를 보완하기 위해 모든 비트를 뒤집고 1을 더합니다.

부호있는 정수에 2의 보수 표현을 사용하여 2의 보수 연산을 적용하여 양수를 음의 등가로 변환하거나 그 반대로 변환합니다. 예를 들어 니블을 사용하면 0001(1)은 1111(-1)이되고 op를 다시 적용하면로 돌아갑니다 0001.

0에서 연산의 동작은 양수 및 음수 0을 특수하게 처리하지 않고 0에 대한 단일 표현을 제공하는 데 유리합니다. 000011111을 더하면을 보완합니다 . 으로 넘쳐서 0000긍정적이고 부정적인 것이 아니라 하나의 영점을줍니다.

이 표현의 주요 장점은 부호없는 정수에 대한 표준 추가 회로가 적용될 때 올바른 결과를 생성한다는 것입니다. 예를 들어 니블에 1과 -1을 추가 0001 + 1111하면 비트가 레지스터에서 오버플로되고 뒤에 남겨 0000집니다.

부드러운 소개를 위해 멋진 Computerphile가 주제에 대한 비디오를 제작했습니다 .


0

간단히 말해서 2's Complement컴퓨터 메모리에 음수를 저장하는 방법입니다. 반면 양수는 일반 이진수로 저장됩니다.

이 예제를 고려해 봅시다.

컴퓨터는 Binary Number System숫자를 나타내는 데 사용 합니다.

x = 5;

이것은로 표현됩니다 0101.

x = -5;

컴퓨터가 -서명 할 때 2의 보수를 계산하여 저장합니다. i.e5 = 0101이고 2의 보수는 1011입니다.

컴퓨터가 숫자를 처리하는 데 사용하는 중요한 규칙은 다음과 같습니다.

  1. 첫 번째 비트가 1negative 숫자 여야합니다 .
  2. 첫 번째 비트를 제외한 모든 비트 0가 없으면 양수가됩니다.-0 숫자 시스템에 입니다. ( 1000 is not -0대신 양수입니다 8)
  3. 모든 비트가 0 있으면입니다 0.
  4. 그렇지 않으면입니다 positive number.


-6

가장 간단한 답변 :

1111 + 1 = (1) 0000. 따라서 1111은 -1이어야합니다. 그런 다음 -1 + 1 = 0입니다.

나를 위해이 모든 것을 이해하는 것이 완벽합니다.


이것은 질문에 대한 답변을 제공하지 않습니다. 저자에게 비평을하거나 설명을 요청하려면 게시물 아래에 댓글을 남겨주세요.
Codor

답입니다. 가장 간단합니다. 나를 위해-가장 좋은 것.
Dmitry
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.