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

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

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

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



답변

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” 으로 해석 하여 혼동됩니다. 일반적으로 하드웨어 가까이에서 작업 할 때이 문제 만 걱정하면됩니다.


답변

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을 적용하십시오.

타다!


답변

내가 본 대부분의 설명과 마찬가지로 위의 설명은 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을 보완하고 추가하여 양수를 만들려고하면 동일한 음수를 다시 얻는다는 것입니다. 제로가 이것을하는 것은 당연한 것처럼 보이지만 이것은 예상치 못한 일이며 컴퓨터를 제외하고는 일반적으로 고정 길이 산술이 아니라 무제한의 자릿수 공급을 생각하기 때문에 우리가 익숙한 행동이 아닙니다.

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


답변

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


답변

당신이 유한 한 수의 비트 / 트릿 / 숫자 / 무엇을 가지고 있다고 상상해보십시오. 모든 숫자를 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의 보수에 대한 좋은 점은 추가 가 작동 한다는 것 입니다. 양수와 음수를 추가하기 위해 특별한 작업을 수행 할 필요는 없습니다!


답변

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

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

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

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

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


답변

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