logo

2의 보수

부호 있는 정수(기사)를 나타내는 세 가지 방법이 있습니다. a: 부호 있는 비트, b: 1의 보수, c: 2의 보수. 이러한 방법이 어떻게 파생되었는지, 그리고 왜 2의 보수가 다른 방법보다 선호되는지 이해해 보겠습니다.

우리가 알고 있듯이 데이터는 비트 단위로 저장됩니다. 부호 있는 정수를 메모리에 어떻게 저장할 수 있나요? 이 문제를 해결하기 위해 먼저 간단한 솔루션을 개발한 다음 문제에 대한 최상의 솔루션을 얻을 때까지 이를 반복합니다.



a) 부호 있는 비트

부호 있는 정수를 저장하려고 할 때 가장 왼쪽 비트를 부호용으로 예약하고 나머지 비트를 사용하여 실제로 값을 저장하는 것이 분명해 보입니다. 예를 들어, 4비트 시스템에서는 왼쪽에서 첫 번째 비트가 부호용으로 예약되고(0은 양수를 나타내고 1은 음수를 나타냄) 나머지 3비트는 값을 저장하는 데 사용됩니다. 마찬가지로 8비트 시스템에서는 왼쪽에서 첫 번째 비트가 부호에 사용되고 나머지 7은 값에 사용됩니다.

아니요 씨.

이진 표현



소수값

0000



+0

0001

+1

0010

+2

0011

+3

그리고

0100

+4

에프

0101

+5

G

0110

+6

시간

0111

+7

1000

-0

제이

1001

-1

케이

1010

-2

1011

-삼

1100

-4

YouTube VLC에서 비디오 다운로드
N

1101

-5

영형

1110

-6

1111

-7

이 접근 방식을 사용하여 부호 있는 정수를 성공적으로 표현할 수 있습니다. 그러나 좀 더 자세히 분석해 보면 다음과 같은 단점을 발견할 수 있습니다.

1) 0의 두 가지 표현:

4비트 시스템에서는 16(24)개의 값을 저장할 수 있어야 하는데 +1~+7, -1~-7은 14개의 값만 저장할 수 있습니다. 나머지 두 값은 어디에 있습니까? 표를 주의 깊게 관찰하면 이 두 값이 0으로 수렴한다는 것을 알 수 있습니다. 따라서 0에 대한 두 가지 표현, 즉 +0에 대한 표현과 -0에 대한 표현이 있습니다.

하지만 0을 나타내는 두 가지 표현이 큰 문제일까요? 그래서 뭐? 16개의 고유 값 대신 15개의 값만 저장할 수 있습니다. 범위를 1씩 줄여도 괜찮지 않나요? 소프트웨어 개발자에게는 문제가 되지 않을 수 있지만 회로 설계자에게는 값이 +0인지 먼저 확인한 다음 -0인지 확인하는 것이 매우 실망스러울 수 있습니다.

2) 음수에는 서명된 확장이 작동하지 않습니다.

데이터의 크기가 빠르게 증가하고 있습니다. 언젠가는 저장할 수 있는 데이터 범위를 늘릴 수 있도록 비트 시스템을 확장해야 합니다. 2014년 강남스타일 동영상은 YouTube 조회수 제한을 초과하여 YouTube에서 조회수를 32비트에서 64비트 부호 있는 정수로 업그레이드해야 했습니다. 마찬가지로 32비트 Unix 시계는 32비트 부호 있는 정수로 시간을 초 단위로 기록하기 때문에 2038년 1월 19일에 오버플로됩니다.

따라서 우리의 표현 시스템이 쉽게 확장 가능해야 한다는 것도 마찬가지로 중요합니다. 이는 이 표현 시스템에서는 불가능합니다.

소수

4비트

5비트

6비트

+2

0010

00010

000010

+7

0111

00111

000111

-2

1010

10010 (!= 11010)

100010 (!= 111010)

-7

1111

10111 (!= 11111)

100111 (!= 111111)

3) 바이너리 덧셈이 작동하지 않습니다:

두 개의 이진수를 더해 보겠습니다.

바이너리

소수

바이너리

소수

바이너리

소수

번호-1

0010

+2

0111

+7

1101

-5

2 번

1010

-2

1010

-2

0011

+3

바이너리 추가

1100

-4

0001

+1

0000

+0

소수 덧셈

+0

+5

-2

여기서 간단한 바이너리 추가가 작동하지 않는 이유는 무엇입니까? 그 이유는 부호 비트(가장 왼쪽)가 일반 비트가 아니고 실제 숫자의 일부도 아니기 때문입니다. 추가를 수행하기 위해 부호 비트를 무시한 다음 부호 비트를 추가하도록 하드웨어 회로를 설계해야 하는 상황을 상상해 보십시오.

따라서 이것은 부호 있는 정수를 표현하는 순진한 방법이었습니다. 이 접근 방식의 주요 문제점은 음수를 아래로 매핑했다는 것입니다. 매핑 시스템을 하향식으로 변경하면 위의 문제 중 일부가 해결될 것입니다.

b) 1's Co 구현

음수를 하향식으로 다시 매핑하면 다음과 같은 이진 테이블을 얻게 됩니다.

예 아니오.

이진 표현

소수값

1의 보수

서명된 비트

0000

+0

+0

0001

+1

+1

0010

+2

+2

0011

+3

+3

그리고

0100

+4

+4

에프

0101

정렬된 튜플 파이썬
+5

+5

G

0110

+6

+6

시간

0111

+7

+7

1000

-7

-0

제이

1001

-6

-1

케이

1010

-5

-2

1011

-4

-삼

1100

-삼

-4

N

1101

-2

-5

영형

1110

-1

-6

1111

-0

-7

1의 보수 방법으로 정수의 이진 표현을 얻는 방법은 무엇입니까?

  • 양수는 부호 있는 정수 방법과 유사하게 표현됩니다.
  • 음수는 해당 양수의 모든 비트를 반전시켜 표현합니다. (반전은 하드웨어 설계시 NOT 게이트를 사용하여 쉽게 수행할 수 있습니다.)

이를 면밀히 분석하여 개선이 이루어졌는지 살펴보겠습니다.

1) 0의 두 가지 표현:

이 접근 방식에서는 0에 대한 두 가지 표현도 있습니다.

2) 음수에는 서명된 확장이 작동하지 않습니다.

서명된 확장은 음수에 완벽하게 작동합니다.

소수

4비트

5비트

6비트

+2

0010

00010

000010

+7

0111

00111

000111

-2

1101

11101

111101

-7

1000

11000

111000

3) 이진 덧셈은 수정된 규칙으로 작동합니다.

바이너리

소수

바이너리

소수

바이너리

소수

번호-1

0010

+2

0111

+7

1010

-5

2 번

1101

-2

1101

-2

0011

+3

바이너리 추가

1111

-0

0100

+4

1101

-2

소수 덧셈

+0

+5

-2

답이 항상 정답은 아니지만 정답에 매우 가깝습니다. 우리가 다음 규칙을 따르면 작동하게 할 수 있습니다. 가장 왼쪽 비트에서 이월을 생성한 경우 이를 버리지 말고 다시 가져와 가장 오른쪽 비트에 추가하세요.

바이너리

소수

바이너리

소수

바이너리

소수

번호-1

0111

+7

1110

-1

0111

+7

2 번

1101

-2

1001

-6

1011

-4

바이너리 추가

(1) 0100

+4

CSS 랩 텍스트
(1) 0111

+7

(1) 0010

+2

뒤로 이월 추가

0101

+5

1000

-7

0011

+3

확실히 1의 보수 방식이 부호 있는 비트보다 낫습니다. 우리의 주요 우려 사항은 해결되었지만 여전히 문제(0을 두 개 표현함)로 남아 있으며 이진 덧셈 해킹은 1의 보수 방법을 개선할 수 있는 단서를 제공합니다. 더 쉽게 하기 위해 이 문장들을 바꿔보겠습니다.

  • 불필요한 0의 추가 표현이 있습니다.
  • 두 개의 이진수를 추가하는 동안 가장 왼쪽 비트에 이월이 있는 경우 결과에 +1을 추가해야 합니다. 즉, 이진 테이블의 다음 행으로 이동하여 올바른 답을 찾을 수 있습니다.

두 가지 모두 0을 추가로 표현하는 것이 문제의 근본 원인임을 알려줍니다. 따라서 이 추가 0을 제거하고 모든 음수 값을 다음 행으로 이동해 보겠습니다. (-7은 I -> J에서 이동하고, -6은 J -> K에서 이동하는 식으로…)

c) 2의 보수

1의 보수 테이블에서 -0을 제거하고 모든 음수 값을 한 행 아래로 이동하면 2의 보수라고 하는 다음 테이블을 얻게 됩니다.

예 아니오.

이진 표현

소수값

2의 보수

1의 보수

서명된 비트

0000

+0

+0

+0

0001

+1

+1

+1

0010

+2

+2

+2

0011

+3

+3

+3

그리고

0100

+4

+4

+4

에프

0101

+5

+5

+5

G

0110

+6

+6

+6

시간

0111

+7

+7

+7

1000

-8

-7

-0

제이

1001

-7

= 7의 역수 + 1비트

-6

-1

케이

1010

-6

= 6의 역수 + 1비트

-5

-2

1011

-5

= 5의 역수 + 1비트

-4

-삼

1100

-4

= 4의 역수 + 1비트

-삼

-4

N

1101

-삼

= 3의 역수 + 1비트

-2

-5

영형

1110

-2

= 2 + 1비트의 역수

-1

-6

1111

10ml ~ 온스
-1

= 1 + 1비트의 역수

-0

-7

2의 보수 방법으로 정수의 이진 표현을 얻는 방법은 무엇입니까?

  • 양수는 부호 있는 정수 방법과 유사하게 표현됩니다.
  • 음수는 해당 양수의 모든 비트를 반전시킨 다음 1비트를 더하여 표현됩니다.

1) 0의 한 가지 표현:

이제 0에 대한 표현은 하나만 있으며 이를 통해 다음을 저장할 수 있습니다. 총 16개의 고유 값(+0 ~ +7 및 -1 ~ -8).

2) 서명된 확장은 음수에 대해 작동합니다.

서명된 확장은 음수에 완벽하게 작동합니다.

소수

4비트

5비트

6비트

+2

0010

00010

000010

+7

0111

00111

000111

-2

1110

11110

111110

-7

1001

11001

111001

3) 이진 덧셈:

바이너리

소수

바이너리

소수

바이너리

소수

바이너리

소수

번호-1

0010

+2

0111

+7

1011

-5

1111

-1

2 번

1110

-2

1110

-2

0011

+3

1010

-6

답변

0000

+0

0101

+5

1110

-2

1001

-7

4) 첫 번째 비트는 부호 있는 비트입니다.

2의 보수에는 모든 양수는 0으로 시작하고 모든 음수는 1로 시작하기 때문에 첫 번째 비트가 부호 비트라는 멋진 속성이 있습니다.

5) 메모리 오버플로 검사:

덧셈을 하면서 우리의 답이 범위 내에 있는지 확인했지만 하드웨어를 설계하는 동안 메모리 오버플로를 감지해야 합니다. 하드웨어 설계자가 오버플로를 포착하기 위해 크기를 확인하는 것은 매우 나쁜 생각입니다. 2의 보수 방법은 메모리 오버플로를 감지하는 매우 간단한 방법을 제공합니다. 나 f 부호 있는 비트에 대한 반입이 부호 있는 비트의 반입과 같지 않으면 메모리 오버플로가 발생한 경우입니다. 즉, 부호 있는 비트에 대한 캐리 인이 0이지만 캐리 아웃이 1이거나 캐리가 1이지만 캐리 아웃이 0인 경우 메모리 오버플로가 발생한 경우입니다.

바이너리

소수

바이너리

소수

바이너리

소수

바이너리

소수

번호-1

1011

-5

0010

2

0111

+7

문자를 문자열로

1011

-5

2 번

1100

-4

0110

6

1110

-2

0011

덧셈

(1) 0111

(0)1000

(1)0101

(0)1110

서명 비트로 가져옴

0

과다

1

과다

1

아니요

0

아니요

비트 서명을 수행

1

0

1

0