>  기사  >  컴퓨터의 음수가 2의 보수로 저장되는 이유는 무엇입니까?

컴퓨터의 음수가 2의 보수로 저장되는 이유는 무엇입니까?

青灯夜游
青灯夜游원래의
2020-12-08 10:34:4813947검색

컴퓨터에서 음수에 2의 보수 저장 장치를 사용하면 기본 컴퓨터 산술 회로가 단순화되므로 덧셈과 뺄셈은 덧셈 회로로만 구현하면 되고 뺄셈 대신 덧셈이 사용됩니다. 보수는 음수의 가장 작은 양수 합동 나머지이므로 음수를 더하는 것과 양수를 빼는 것은 모두 보수를 더하는 것으로 표현될 수 있습니다.

컴퓨터의 음수가 2의 보수로 저장되는 이유는 무엇입니까?

이 튜토리얼의 운영 환경: Windows 7 시스템, Dell G3 컴퓨터.

1. 소개

컴퓨터에 정수가 어떻게 저장되는지 아시나요? 부호 비트에 값 비트를 더한 것입니까? 값 비트가 일반 바이너리 형식으로 저장되어 있습니까?

마지막 두 질문에 '예'라고 대답하면 3비트 바이너리로 저장되고 부호 비트 0이 양수를 나타내고 1이 음수를 나타내면 1이 001, -1로 저장된다는 의미입니다. 101로 저장됩니다. 불행하게도 컴퓨터는 현재 자연스러운 형식 대신 2의 보수 형식으로 정수를 저장합니다. 2의 보수도 부호 비트와 값 비트로 표시되지만 표현 규칙은 다릅니다. 1은 001로 저장되고, -1은 111로 저장됩니다. 001,-1会存储成101。可惜事实不是这样,计算机中是用补码的形式而不是刚刚那种看上去很自然的形式存储整数,补码虽然也是用符号位加值位来表示,但表示的规则不太一样:1会存成001,-1会存成111

如果三个问题你都回答对了,你知道计算机中整数以补码的形式存储,但你知道为什么要用这种形式吗?以及「正数的补码等于原码;负数的补码等于反码加1,而反码等于原码符号位不变,其余各位取反」这样的补码到底意味着什么?(假设你不知道,请接着往下看吧 XD)

先看使用补码的目的,然后忘掉上面那个补码定义,跟我从这个目的开始,一步步探索补码的本质。
目的:为了简化计算机基本运算电路,使加减法都只需要通过加法电路实现,也就是让减去一个正数或加上一个负数这样的运算可以用加上一个正数来代替。于是改变负数存储的形式,存储成一种可以直接当成正数来相加的形式,这种形式就是补码。(正数不用变,所以接下来的讨论中一般略去正数)

2.补码是怎么把减法变成加法的?

2.1.用时钟理解减法变加法

这是一个身边的例子,当你校对时钟的时候,假设发现钟是6点,但实际上现在才2点,也就是它走快了4个小时,你可以有两种方法进行校正,一种是逆时针拨回4个小时到2点,另一种是顺时针拨6个小时到12点然后再拨2小时,也就是顺时针拨8个小时到2点。所以对于时钟的表盘来说,设-N表示逆时针拨N个小时,N表示顺时针拨动N个小时,那么-4 = +8,同样还会有 -1 = +11-5 = +7,甚至也可以 -4 = +8 = +20 = +32 = -16...

这里边隐藏了什么规律?其实在数学中,-4、+8、+20、+32、-16可以归为符合某个条件的同一类数字 —— 对于模12同余

中文维基上对于模和同余的定义是:两个整数a、b,若它们除以正整数m所得的余数相等,则称a、b对于模m同余。

而在一个可溢出计数系统中,把计数系统容量作为模,那么所有对此模同余的数在此计数系统中都会有同样的表示,而且运算等价。
比如上面例子中的时钟表盘就是一个可溢出计数系统,模为12,所以-4、+8、+20、+32、-16这些对模12同余的数在时钟表盘上的表示是一样的,而且对时针做这些操作的结果也是一样的,都会拨到同样的位置。

一个n位二进制构成的计数系统,因为会舍弃溢出的高位,所以也是一个可溢出的计数系统,它的模为(2^n) 。(从0数到(2^n -1),再多就溢出)
由此可以推理,在一个3位二进制构成的模为8的计数系统中,-2,-10,6,14

세 가지 질문을 모두 올바르게 답하셨다면 컴퓨터에서 정수가 2의 보수 형식으로 저장된다는 사실을 아실 텐데, 이 형식이 왜 사용되는지 아시나요? 그리고

"양수의 보수는 원래 코드와 같고, 음수의 보수는 보수에 1을 더한 것과 같고, 보수는 변경되지 않은 원본 코드의 부호 비트와 같고, 나머지 비트는 거꾸로."

이러한 보완은 무엇을 의미하나요? (모르는 분들은 XD를 읽어주세요)

먼저 보완코드를 사용하는 목적을 살펴보고, 위의 보완코드 정의는 잊어버리고 이 목적부터 따라오세요. 그리고 코드의 본질을 단계별로 탐구합니다.
목적: 기본적인 컴퓨터 연산 회로를 단순화하기 위해 덧셈과 뺄셈은 덧셈 회로를 통해서만 구현하면 됩니다. 즉, 양수 뺄셈 또는 음수 덧셈을 수행할 수 있습니다.

에 양수

를 더해 계산하세요. 그래서 음수의 저장형태를 변경하여 양수로 직접 더할 수 있는 형태로 저장하는 것이 바로 보수코드이다. (양수는 변경할 필요가 없으므로 다음 논의에서는 일반적으로 양수를 생략합니다.)

2. 보수 코드는 어떻게 뺄셈을 덧셈으로 바꾸나요?

2.1 뺄셈과 덧셈을 이해하려면 2시, 즉 4시간 더 빨리 가는 것을 두 가지 방법으로 수정할 수 있습니다. 하나는 시계 반대 방향으로 2시로 돌리는 것입니다. 시계, 다른 하나는 시계 방향으로 6시간을 돌려 12시 방향으로 돌린 다음 다시 2시간을 다이얼하는 것입니다. 즉, 시계 방향으로 8시간을 돌려 2시 방향으로 돌리는 것입니다. 따라서 시계 다이얼의 경우 -N이 N시간을 시계 반대 방향으로 돌리는 것을 의미하고 N이 N시간을 시계 방향으로 돌리는 것을 의미한다면 -4 = +8입니다. , -1 = +11, -5 = +7, 심지어 -4 = +8 = + 20 = +32 = -16도 있습니다. ...

여기에는 어떤 규칙이 숨겨져 있나요? 실제로 수학에서 -4, +8, +20, +32, -16

합동 모듈로 12🎜에 대해 특정 조건을 충족하는 동일한 유형의 숫자로 분류될 수 있습니다. 🎜🎜

중국 위키에서 모듈러스와 합동의 정의는 다음과 같습니다. 두 개의 정수 a와 b, 이를 양의 정수 m으로 나누어 얻은 나머지가 같으면 a와 b는 다음과 같습니다. 모듈로 m을 유지하세요. 🎜🎜

오버플로 가능한 계산 시스템에서 계산 시스템의 용량을 모듈로로 취하면 이 모듈러스와 일치하는 모든 숫자는 이 계산 시스템에서 동일한 표현을 갖게 되며 작업은 동일합니다.
예를 들어, 위 예의 시계 다이얼은 모듈로 12인 오버플로 계산 시스템이므로 -4, +8, +20, +32, -16은 모듈로 12와 일치합니다. 시계 다이얼의 숫자 표시는 동일하며 시침의 이러한 작동 결과도 동일하므로 모두 동일한 위치에 설정됩니다. 🎜

n비트 바이너리로 구성된 카운팅 시스템입니다. 오버플로된 상위 비트는 버려지기 때문에 이 역시 오버플로 가능한 카운팅 시스템이며 모듈러스는 (2^n)입니다. (0부터 (2^n -1)까지 계산하면 더 이상 오버플로됩니다.)
3비트 바이너리 모듈로 8, -2, -10, 6으로 구성된 계산 시스템에서 추론할 수 있습니다. , 14는 동일한 이진수로 나타낼 수 있습니다. 10을 빼고 동시에 14를 더하면 같은 결과를 얻을 수 있습니다. 🎜🎜🎜🎜2.2. 보수 코드로 이어짐🎜🎜🎜🎜그래서 보수 코드가 음수의 양수 합동인 한, 이 양수 합동 보수 코드를 추가하는 것은 다음과 같은 효과를 얻을 수 있습니다. 또 다른 음수를 추가하세요🎜. 음수에 대해서는 조건을 만족하는 양의 합동이 무수히 존재하며, 불필요한 연산을 줄이기 위해 그 중에서 가장 작은 양수를 보수로 지정할 수 있다. 🎜🎜아마도 원본 코드를 통해 보완 코드를 찾는 것이 보완적인 모듈로 연산이기 때문에 보완 코드라고 부릅니다. 🎜🎜🎜여기의 보완 코드는 모두 제가 특별히 표시한 것입니다. 왜냐하면 이것은 컴퓨터에 저장된 실제 보완 형식이 아니기 때문입니다. 보완 번호라고 불러야 하지만, 매우 가깝습니다🎜.

3. 보완 코드 완성하기

3.1 이 보완 코드 표현에는 여전히 몇 가지 문제가 있습니다

보완 코드로 변환하면 숫자를 빼는 것이 숫자를 더하는 것이 됩니다. , 그러나 그러나 명백한 문제가 있습니다. 즉, 숫자 자체의 기호가 손실된다는 것입니다.
예를 들어 3자리 이진수는 일반적으로 0~7을 나타냅니다. 보수 방법을 사용하면 -8~-1의 연산을 대체할 수 있지만 - 8~-1, 양수인지 음수인지 알 수 없기 때문입니다. 0~7,使用补码法它能代替-8~-1的运算,但它不能真正表示-8~-1,因为你不知道它到底是正数还是负数。
我们把负数转换成了一种在运算中更让计算机喜欢的形式,但它却丢失了自己本身作为数的信息。

怎么解决这个问题,可能有人很快就拍脑袋:那就加一位来表示正负得了。但这样的话运算时怎么办,从第二位开始算么?那进位去位的时候是不是也需要特别注意一下不要影响到符号位?你会发现这个问题并不是那么简单。

3.2.怎么完善 补码

不知道大牛是怎么想到的,问题解决得非常完美:

  • 在保持补码特性的前提下 (也就是减一个数还是照样变成加一个数)
  • 增加正负的表示 (能真正表示-8~-1 음수를 계산 시 컴퓨터에 더 적합한 형식으로 변환했지만 숫자 자체에 대한 정보는 손실되었습니다.
  • 이 문제를 해결하는 방법 어떤 사람들은 빨리 머리를 때릴 수 있습니다. 그런 다음 숫자 하나를 추가하여 양수 또는 음수를 나타냅니다. 그런데 이 경우 계산할 때 어떻게 해야 합니까? 두 번째 자리부터 계산을 시작해야 합니까? 비트를 수행할 때 부호 비트에 영향을 주지 않도록 특별히 주의해야 합니까? 문제가 그렇게 간단하지 않다는 것을 알게 될 것입니다.

  • 3.2. 보완 코드 개선 방법

다니엘이 어떻게 생각해냈는지는 모르겠지만 문제는 완벽하게 해결되었습니다:


  • 보완 코드를 유지하면서 특성을 전제로 (즉, 숫자를 빼도 여전히 숫자를 더하게 됨)
  • 양수와 음수의 표현을 늘립니다(진정하게 -8을 표현할 수 있음) ~-1, 부호 비트가 0인지 1인지만 보세요)
  • 또한 부호 비트를 구분하지 않고 연산을 수행할 수도 있으며, 부호 비트를 계산을 위한 값 비트로 직접 처리하고, 결과는 자연스럽게 이 부호 비트를 따르게 됩니다. (즉, 부호 비트의 캐리와 값 비트의 캐리는 자연스럽게 합리적입니다.)
    그리고 해결책은 정말 멍청하고 놀랍도록 간단합니다. 이전에 생각했던 것:

    양수와 음수를 나타내려면 숫자 하나를 추가하세요.

    구체적인 방법은

    입니다. 왼쪽의 상위 비트에 부호 비트를 추가합니다. 이 부호 비트는 앞서 추론한 의사 보완 코드와 함께 정말 완벽한

    보보 코드
      를 형성합니다.
    • 얻은 효과: 부호 비트를 읽으면 숫자의 부호를 알 수 있습니다. 동시에 부호 비트는 덧셈 연산의 값 비트처럼 연산에 참여하고 전달합니다.
    • 4. 마지막으로
    • summarize
    보완 코드를 사용하는 목적

    : 기본 컴퓨터 연산 회로를 단순화하여 덧셈과 뺄셈만 덧셈 회로로 구현하고 대신 덧셈을 사용합니다. 빼기.

    보완 코드가 이 목적을 달성할 수 있는 이유🎜: n비트 바이너리는 오버플로 가능한 계산 시스템을 형성할 수 있습니다. 이러한 시스템에서는 계산 시스템의 용량이 모듈러스로 사용되며 이 모듈러스와 일치하는 모든 숫자가 사용됩니다. 이 계산 시스템에서는 동일한 표현을 가지며 작업도 동일합니다. 보수는 음수의 가장 작은 양수 합동 나머지이므로 음수를 더하는 것과 양수를 빼는 것은 모두 보수를 더하는 것으로 표현될 수 있습니다. 🎜🎜🎜보수 계산 방법🎜: 양수의 보수는 음수의 경우 가장 작은 양수 합동 나머지(모듈로는 값 비트의 용량)를 찾아 값 비트에 넣습니다. 음수의 보수를 얻으려면 부호 위치를 1로 설정합니다. 🎜🎜🎜더 많은 관련 글을 읽고 싶으시면 🎜PHP 중국어 홈페이지🎜를 방문해 주세요! ! 🎜

    위 내용은 컴퓨터의 음수가 2의 보수로 저장되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.