문제

나는 컴퓨터 시스템 코스고 고군분투, 부분에서,함께 두 개의 보충.나는 그것을 이해하려 하지만 모든 것을 내가 읽지 않은 가져온 그림을 함께한다.영 위키 문서 및 기타 다양한 기사를 포함하여, 나의 텍스트 예약.

따라서,나를 시작하고 싶었 이 커뮤니티 wiki 게시 무엇을 정의하는 두 개의 보수가 사용하는 방법,그리고 어떻게 영향을 미칠 수 있습 숫자 작업 중에 다음과 같 캐스트(에서 서명 서명되지 않고 반대로),비트 운영 및 비트 시프트 작업입니다.

무엇을 유의하시기 바랍니 명확하고 간결한 정의 는 것이 쉽게 이해에 의해 프로그래머입니다.

도움이 되었습니까?

해결책

둘의 보완은 일반적인 수학 문제를 구현하기가 매우 간단 할 수 있도록 정수를 저장하는 영리한 방법입니다.

이해하려면 바이너리의 숫자를 생각해야합니다.

기본적으로 말합니다.

  • 0의 경우 모든 0을 사용하십시오.
  • 양수 정수의 경우 최대 2로 계산을 시작하십시오.(비트 수 -1)-1.
  • 네거티브 정수의 경우 정확히 동일한 작업을 수행하지만 0과 1의 역할을 전환하십시오 (0000으로 시작하는 대신 1111로 시작하십시오. 이것이 "보완"부분입니다).

4 비트의 미니 바이트로 시도해 봅시다 (우리는 그것을 한입 깨물기 -1/2 바이트).

  • 0000 - 영
  • 0001 - 하나
  • 0010 - 둘
  • 0011 - 삼
  • 0100 에게 0111 - 4-7

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

네거티브 :

  • 1111 - 부정적인 것
  • 1110 - 네거티브 둘
  • 1101 - 네거티브 3
  • 1100 에게 1000 - 네거티브 4에서 네거티브 8

네거티브에 대해 하나의 추가 값을 얻는다는 점에 유의하십시오 (1000 = -8) 당신은 긍정적 인 것이 아닙니다. 이 때문입니다 0000 0에 사용됩니다. 이것은로 간주 될 수 있습니다 숫자 라인 컴퓨터의.

양수와 음수를 구별합니다

이렇게하면 첫 번째 비트는 양수와 음의 소수점 값을 구별하는 데 사용할 수 있기 때문에 "부호"비트의 역할을 얻습니다. 가장 중요한 비트라면 1, 이진은 부정적이라고 말할 수 있습니다. 가장 중요한 비트 (가장 왼쪽)는 0, 당신은 소수점 값이 양수라고 말할 수 있습니다.

"하나의 칭찬"음수 숫자는 단지 부호 비트를 뒤집은 다음 0에서 계산합니다. 그러나이 접근법은 해석을 다루어야합니다. 1000 혼란스러운 "네거티브 제로"로. 일반적으로 하드웨어 근처에서 작업 할 때만 걱정하면됩니다.

다른 팁

제가 궁금해하는 경우에 그것을 설명할 수 있었든 위키 문서입니다.

기본적인 문제는 너를 해결하기 위해 노력하고 있으로 두 개의 보충 표현의 문제에 저장하는 부정적인 정수입니다.

첫째로 고려하는 부호 없는 정수에 저장되는 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.더 큰 문제는 추가하고 빼는 이진수입니다.회로 더하기 및 빼기를 사용하여 로그인 크기는 것은 매우 복잡합니다.

은 무엇인

0010
1001 +
----

?

다른 시스템 초과 표기.저장할 수 있는 부정적인 숫자를 제거하는 두 개의 제 문제가 있지만 또한 빼기 어려운 남아 있다.

그래서 함께 오는 두 개의 보완.지금 저장할 수 있습니다 긍정적이고 부정적인 정수 및 수산 상대적으로 쉽습니다.의 수 있는 방법을 변환하는 번호로 두 개의 보완.여기에 하나입니다.

변환 소수하는 두 개의 보충

  1. 변환 번호하는 바이너리(무시하는 기호를 지금) 예:5 0101 및 -5 0101

  2. 수은 긍정적 인수 한 다음 작업이 완료됩니다.예:5 0101 에서는 바이너리를 사용하여 조로 보충됩니다.

  3. 는 경우는 번호가 부정적인 다음

    3.1 찾 보수(반전가 0 과 1) 예:-5 0101 그래서 찾는 것을 보완하는 1010

    3.2 추가 1 을 보완 1010+1=1011.따라서,-5 에서 두 개의 보충은 1011.

그래서,당신은 무엇을 하고 싶었 2+(-3)에서 이진?2+(-3)은-1 입니다.당신은 무엇을 해야 하는 경우에 당신을 사용하여 로그인 크기 추가 이러한 번호?0010+1101=?

를 사용하여 두 개의 보충을 고려 얼마나 쉬운 것입니다.

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

변환하는 두 개의 보수를 소수점

변환 1111 수:

  1. 숫자 1 로 시작하는,그래서 그것은 부정적인,그래서 우리는 우리를 찾을 보완 1111,는 0000.

  2. 추가 1 0000,그리고 우리는 구 0001.

  3. 변환 0001 수,which is1.

  4. 적용 표=-1.

을 포함합니다.

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

소수점에서 어떻게 작동하는지 기억하십시오.
  2345
글을 쓰는 방법입니다
  2 × 103 + 3 × 102 + 4 × 101 + 5 × 100.

같은 방식으로 바이너리는 0 그리고 1 같은 일반적인 아이디어에 따라 위의 10을 2s로 대체합니다. 그런 다음 이진에서
  1111
글을 쓰는 방법입니다
  1 × 23 + 1 × 22 + 1 × 21 + 1 × 20
그리고 당신이 그것을 해결한다면, 그것은 15 (기본 10)로 판명됩니다. 그 이유 때문입니다
  8+4+2+1 = 15.

이것은 모두 양수에 적합하고 좋습니다. 인간이 소수점 숫자로하는 것처럼 마이너스 징후를 기꺼이 꽂으려면 마이너스 숫자로 작동합니다. 그것은 컴퓨터에서도 할 수 있지만, 나는 1970 년대 초부터 그런 컴퓨터를 보지 못했습니다. 다른 토론의 이유를 남겨 둘 것입니다.

컴퓨터의 경우 사용하는 것이 더 효율적입니다. 보어 음수에 대한 표현. 그리고 여기에 종종 간과되는 것이 있습니다. 보완 표기법에는 숫자의 숫자의 반전, 심지어 정상적인 양수 이전에 나오는 암시 적 제로조차도 포함됩니다. 질문이 생겨나 기 때문에 어색합니다. 모두가 있습니까? 그것은 무한한 숫자가 고려 될 수 있습니다.

다행히도 컴퓨터는 무한대를 나타내지 않습니다. 숫자는 특정 길이 (또는 원하는 경우 너비)로 제한됩니다. 따라서 양수 이진 번호로 돌아가 봅시다. 이 예제에는 8 자리 ( "비트")를 사용하겠습니다. 그래서 우리의 이진수는 실제로 그럴 것입니다
  00001111
또는
  0 × 27 + 0 × 26 + 0 × 25 + 0 × 24 + 1 × 23 + 1 × 22 + 1 × 21 + 1 × 20

2의 보완 음성을 형성하려면 먼저 모든 (이진) 숫자를 형성합니다.
  11110000
양식에 1을 추가하십시오
  11110001
그러나 우리는 어떻게 -15를 의미하는 것을 이해해야합니까?

대답은 우리가 고차 비트의 의미를 바꾸는 것입니다 (가장 왼쪽). 이 비트는 a 1 모든 음수에 대해. 변경 사항은 표시되는 숫자의 가치에 대한 기여의 부호를 변경하는 것입니다. 이제 우리의 11110001 대표하는 것으로 이해됩니다
  -1 × 27 + 1 × 26 + 1 × 25 + 1 × 24 + 0 × 23 + 0 × 22 + 0 × 21 + 1 × 20
그 표현 앞에서 "-"에 주목하십니까? 그것은 부호 비트가 무게 -2를 운반한다는 것을 의미합니다.7, 그것은 -128 (베이스 10)입니다. 다른 모든 위치는 서명되지 않은 이진 번호로 동일한 무게를 유지합니다.

우리의 -15를 해결합니다
  -128 + 64 + 32 + 16 + 1
계산기에서 시도하십시오. -15입니다.

내가 컴퓨터에 표시된 음수 숫자를 본 세 가지 주요 방법 중 2의 보완은 일반적인 사용으로 편의를 위해 손을 뻗어냅니다. 그러나 그것은 이상하다. 이진이기 때문에 가능한 수의 가능한 비트 조합이 있어야합니다. 각 양수는 음수와 짝을 이룰 수 있지만 0은 단 하나뿐입니다. 0을 부정하면 0이됩니다. 그래서 하나 더 조합이 있습니다. 1 사인 비트와 0 다른 곳. 해당 양수는 사용되는 비트 수에 맞지 않습니다.

이 숫자에 대한 더 이상한 점은 보완하고 추가하여 양수를 형성하려고하면 동일한 음수를 다시 얻는다는 것입니다. 제로가 이것을하는 것은 당연한 것처럼 보이지만, 이것은 예상치 못한 일이며, 이것은 컴퓨터를 제쳐두고 있기 때문에 우리가 사용하는 모든 행동이 아닙니다. 우리는 일반적 으로이 고정 길이의 산술이 아니라 무제한의 숫자 공급을 생각합니다.

이것은 이상한 빙산의 끝과 같습니다. 표면 아래에 기다려 놓는 것이 더 많지만이 논의에 충분합니다. 고정점 산술에 대해 "오버플로"를 조사하면 더 많은 것을 찾을 수 있습니다. 실제로 들어가고 싶다면 "모듈 식 산술"을 연구 할 수도 있습니다.

2의 보완은 이진의 가치를 찾는 데 매우 유용하지만, 그러한 문제를 해결하는 훨씬 간결한 방법을 생각했습니다 (다른 사람이 게시 한 적이 없습니다).

예를 들어 이진을 가져 가십시오. -3.

2의 보완을 사용하여 우리는 이렇게 할 것입니다 ... 플립 1101 ~ 0010 ... 추가 0001 + 0010 ===> 0011. 0011은 양수 이진 = 3으로 제공합니다. 따라서 1101 = -3!

내가 깨달은 것 :

모든 뒤집기와 추가 대신 양의 이진을 해결하기위한 기본 방법 만 수행 할 수 있습니다 (0101이라고하자)3 * 0) + (22 * 1) + (21 * 0) + (20 * 1) = 5.

부정적인 것으로 정확히 같은 개념을 수행하십시오! (작은 비틀기)

예를 들어 1101을 가져 가십시오.

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

그런 다음 평소와 같이 계속하십시오 -8 + (22 * 1) + (21 * 0) + (20 * 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의 보완. 컴퓨터는 일반적으로 사용합니다 둘의 보완, 숫자 대신 비트를 사용하는 것을 제외하고는 동일합니다.

Ten의 보완에 대한 좋은 점은 그 추가입니다. 그냥 작동합니다. 양수와 음수를 추가하기 위해 특별한 일을 할 필요는 없습니다!

주어진 숫자의 1 대 1에 1을 추가하여 두 개의 보완이 발견됩니다. 우리가 10101 그런 다음 보완, 즉 01010 추가하다 1 이 결과, 즉 01010+1=01011, 이것이 최종 답변입니다.

환상적인 설명을 읽었습니다 Reddit에서 JNG는 주행 거리계를 유추로 사용합니다.

enter image description here

유용한 규칙입니다. 이진에서 양수 숫자를 추가 / 빼는 동일한 회로 및 논리 연산은 컨벤션을 사용하는 경우 여전히 양수와 음수 모두에서 작동하므로 유용하고 전능 한 이유입니다.

자동차의 주행 거리계를 상상해보십시오. 99999에서 구르고 있습니다. 00000을 증가 시키면 00001을 얻습니다. 00000을 줄이면 99999 (롤 라운드로 인해)를받습니다. 99999로 다시 추가하면 00000으로 돌아갑니다. 따라서 99999가 -1을 나타내는 것이 유용합니다. 마찬가지로, 99998이 -2 등을 나타내는 것이 매우 유용합니다. 당신은 어딘가에 멈춰야하며, 또한 컨벤션에 의해, 숫자의 상단 절반은 음수로 간주되고 (50000-99999), 하단 절반은 그저 자신을 의미합니다 (00000-49999). 결과적으로, 상단 숫자는 5-9 인 상단 숫자는 표현 숫자가 음수임을 의미하며, 0-4임을 의미합니다.

이것을 이해하는 것은 나에게도 어려웠습니다. 일단 내가 그것을 얻었고 책 기사와 설명을 다시 읽기 위해 돌아 왔을 때 (당시 인터넷은 없음), 그것을 묘사 한 많은 사람들이 실제로 그것을 이해하지 못했다고 밝혔다. 나는 그 이후에 책을 가르치는 어셈블리 언어 (10 년 동안 아주 잘 팔렸다)를 썼다.

8 비트를 사용하여 이진 형태로 10-12를 받자 : 10 + (-12)

우리는 10에서 빼기 위해 12의 칭찬 부분을 가져와야합니다. 이진의 12에서 12는 00001100입니다.

12의 칭찬 부분을 얻으려면 모든 비트를 뒤집은 다음 1을 추가 한 다음 1을 추가합니다. 12는 역전 된 바이너리 리버스입니다. 이는 역 코드 (하나의 보완)이기도합니다. 이제 우리는 11110100을 추가해야합니다.

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

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

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

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

예 : 63-24 = x

우리는 실제로 단지 24의 보완을 추가합니다 (100-24). 실제로 우리가하는 일은 방정식의 양쪽에 100을 추가하는 것입니다.

이제 방정식은 100 + 63-24 = x + 100입니다. 그래서 우리는 100 (또는 10 또는 1000 또는 무엇이든)를 제거합니다.

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

우리가 큰 9 개의 나이트 체인에서 빼고 숫자가 제시되면, 우리는 그 숫자를 뒤집기 만하면됩니다.

예 : 99999-03275 = 96724

그것이 9의 보완 후, 우리는 1을 추가하는 이유입니다. 아마도 어린 시절 수학에서 알다시피, 9는 '도둑질'으로 10이됩니다. 따라서 기본적으로 그것은 차이에서 1을 차지하는 10의 보완입니다.

바이너리에서는 2의 보완 물이 10의 보완 과정에 달려 있고, 1은 9의 보완을 보완합니다. 주요 차이점은 10의 전력과 차이를 분리하려고 시도하는 대신 (10, 100 등을 방정식에 추가) 2의 전력과 차이를 분리하려고한다는 것입니다.

이런 이유로 우리는 비트를 뒤집습니다. 우리의 Minuend가 10 진수의 9 가지 사슬 인 것처럼, 우리의 Minuend는 이진의 사슬입니다.

예 : 111111-101001 = 010110

하나의 사슬은 2의 멋진 힘 아래 1이기 때문에, 그들은 10 진수의 차이와 같은 차이에서 '훔치기'1입니다.

우리가 네거티브 바이너리 숫자를 사용할 때, 우리는 단지 다음과 같이 말합니다.

0000-0101 = x

1111 - 0101 = 1010

1111 + 0000-0101 = x + 1111

'분리'X를 사용하려면 1111이 10000에서 떨어져 있고 원래 차이에 추가했기 때문에 1을 제거하기 때문에 1을 추가해야합니다.

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

10000 + 0000-0101 = x + 10000

양쪽에서 10000을 제거하여 x를 얻으십시오. 기본 대수입니다.

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

혼란은 보완 수의 정의에 대한 이해가 좋지 않다는 점에서 비롯됩니다. 보완은 무언가를 완성시키는 누락 된 부분입니다.

Radix B에서 n 자리 번호 X의 radix 보완은 정의에 따라 b^nx입니다. 바이너리 4에서는 3 자리 (n = 3)와 2 (b = 2)의 라드를 갖는 100으로 표시됩니다. 따라서 radix 보완은 b^nx = 2^3-4 = 8-4 = 4 (또는 이진에서 100)입니다.

그러나, 이진에서, Radix의 보완을 얻는 것은 radix 보체가 감소하는 것만 큼 쉽지 않다. 감소 된 Radix 보완을 얻으려면 모든 자리를 뒤집습니다.

100-> 011 (감소 된 (원) radix 보완)

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

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

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

/* 빈센트의 시작

1111을 소수점으로 변환 :

숫자는 1로 시작하므로 음수이므로 0000 인 1111의 보완을 찾으십시오. 1에 0000을 추가하고 0001을 얻습니다. 0001을 10 진수로 변환합니다. 타다!

빈센트의 끝 */

다음과 같이 이해해야합니다

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

X : 1111의 보완 X : 1111-1-> 1110; x = 0001, (모든 자릿수를 플립)

부호를 적용하고 답변 = -x = -1.

나는 Lavinio의 대답을 좋아했지만 변화하는 비트는 약간의 복잡성을 더합니다. 종종 부호 비트를 존중하는 동안 또는 부호 비트를 존중하지 않고 움직이는 비트를 선택할 수 있습니다. 이것은 서명 된 숫자를 취급하는 것 (니블의 경우 -8 ~ 7, 바이트의 경우 -128 ~ 127) 또는 전체 범위 부호없는 숫자 (니블의 경우 0 ~ 15, 바이트의 경우 0 ~ 255) 사이의 선택입니다.

데이터 유형의 비트 조합의 약 절반이 네거티브 정수를 위해 예약되어 있고 해당 양수 정수와 함께 대부분의 음의 정수를 추가하면 캐리 오버플로가 발생하는 영리한 정수를 인코딩하는 영리한 수단입니다. 결과는 이진 0이됩니다.

따라서, 2의 보완에서 0x0001이면 -1은 0x1111이므로 0x0000의 합계가 결합 될 것이기 때문입니다 (오버플로가 1).

2의 보완 : 숫자의 1 보완 물이있는 추가를 추가하면 2의 보완을 얻을 수 있습니다. 예를 들어 : 100101은 1의 보완은 011010이고 2의 보완은 011010+1 = 011011입니다 (1의 보충제가있는 하나를 추가 함). 자세한 내용은 이 기사는 그래픽으로 설명합니다.

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

  1. 0의 여러 표현을 피하기 위해
  2. 오버플로의 경우 캐리 비트 (보완 물에서와 같이)를 추적하지 않도록합니다.
  3. 추가 및 뺄셈과 같은 간단한 작업을 수행하는 것이 쉬워집니다.

당면한 문제에 대한 자세한 설명을 원한다면 저에게 쓴 기사를 시도해보십시오. 여기. 도움이되기를 바랍니다!

보완 단어는 완전성에서 비롯됩니다. 10 진수 세계에서 숫자 0 ~ 9는 보어 모든 소수점 숫자를 표현하기 위해 숫자 또는 숫자 기호의 (완전한 세트). 이진계에서 숫자 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 보완은 부정적인 것을 의미하지 않습니다. 서명 된 수량을 의미합니다. 소수에서와 같이 크기는 양의 양으로 표시됩니다. 구조는 부호 확장을 사용하여 더 많은 비트로 레지스터 []로 홍보 할 때 수량을 보존합니다.

       [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.

이것은 각 비트를 개별적으로 뒤집거나 반전시키는 것과 동일합니다. 이로 인해 음의 제로가 발생하여 잘 사랑받지 못하므로 1에 1에 보완 된 사람을 추가하면 문제가 없어집니다. 2S 보완을 부정하거나 취하려면 먼저 1S 보완을 취한 다음 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 Carry 111110 Carry 0110은 000110 1111 111111 Sum 0101 Sum 000101과 동일합니다.

빼기 :

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

2의 보체 작업을 할 때 숫자의 왼쪽에있는 빈 공간은 양수의 숫자에 대한 0으로 채워져 있습니다. 캐리는 항상 추가되며 1 또는 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;

주어진 숫자의 2의 보완은 아니오입니다. 1의 No 보완으로 1을 추가하여 얻었습니다. 바이너리 번호가 있다고 가정 해 봅시다 : 10111001101 1의 보완은 : 01000110010이고 2의 보완은 다음과 같습니다. 01000110011

비트를 보완하는 것은 숫자를 모두 보완하는 것입니다. 둘이 보완하기 위해 모든 비트를 뒤집고 하나를 추가합니다.

서명 된 정수에 대해 2의 보완 표현을 사용하여 2의 보완 조작을 적용하여 양수를 음의 동등성으로 변환하고 그 반대도 마찬가지입니다. 따라서 니블을 사용하여 예를 들어 0001 (1)됩니다 1111 (-1) 그리고 OP를 다시 적용하고 0001.

제로에서의 작업의 동작은 양성 및 부정적인 제로의 특별한 취급없이 0에 대한 단일 표현을 제공하는 데 유리합니다. 0000 보완 1111, 1이 추가 될 때. 오버플로 0000, 우리에게 긍정적이고 부정적인 것이 아니라 하나의 0을 제공합니다.

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

부드러운 소개를 위해 멋진 컴퓨터가 주제에 대한 비디오.

2의 보완은 본질적으로 이진수의 첨가제 역을 제시하는 방법입니다. 이진 형태의 숫자가 주어지면 원래 숫자에 추가 될 때 어떤 비트 패턴이 결과를 0으로 만들까요? 이 비트 패턴을 만들 수 있다면 해당 비트 패턴은 원래 숫자의 -Ve 표현 (추가 역)입니다. 정의에 따르면 첨가제 역에 숫자를 추가하면 항상 0이됩니다. 예 : 소수점 5 인 101을 가져 가십시오. 이제 작업은 주어진 비트 패턴 (101)에 추가 될 때 비트 패턴을 제시하는 것입니다. 그렇게하려면 오른쪽에서 가장 101의 오른쪽에서 시작하고 각 개별 비트에 대해 다시 같은 질문을하십시오. 결과를 0으로 만들기 위해 "이 비트에 어떤 비트를 추가해야합니까? 평소 이월을 고려하여 계속해서 수행하십시오. 우리가 가장 오른쪽 3 개의 오른쪽 (주요 0에 관계없이 원래 숫자를 정의하는 숫자)을 완료 한 후 마지막 캐리는 첨가제 역의 비트 패턴으로 들어갑니다. 또한, 우리는 단일 바이트의 원래 숫자를 보유 할 수 있기 때문에, 첨가제 역의 다른 모든 선행 비트도 1이어야하므로 컴퓨터가 "그"스토리지 유형 (char)을 사용하여 숫자와 추가 역수를 추가 할 때 그 숯의 결과는 모두 0이 될 것입니다.

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

온라인 계산기를 사용하여 소수점 숫자의 두 보완 바이너리 표현을 계산할 수도 있습니다. http://www.convertforfree.com/twos-complement-calculator/

가장 간단한 답변 :

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

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top