补码

补码

一、计算机系统基础

​ 首先,我们要明白,计算机是二进制进行存储的。归根到底,其实就是发光二极管的通断两种状态。

​ 计算机有32位的,也有64位的。这个32\64所表达的其实就是一个机器字长,就是我们的CPU一次运算所能进行的上限。我们的电脑一般CPU是64位的,向下兼容32位,但是由于我们的操作系统只有32位,因此,一般情况下,我们所接触的其实都是32位。

​ 现在,步入正题,这个32位|64位其实就是一个机器字长,就是机器进行一次运算的上限。一般的,我们采用一个机器字长作为一个int类型的长度。一个字节 == 8位,所以一个int类型,4个字节,32位,其中有一个是符号位,所以这个int可以表达正负 \(2^{32} - 1\) 的数据范围。

​ 计算机计算表达式的时候,表达式结果分步计算,计算结果会临时储存在内存中。这部分内容就涉及到内存管理了,这条语句执行的时候,会在内存中开辟一个临时变量,这个变量的生命周期很短,遇到 “;” 之后就会被回收。但是,他依然是存在过的,也是必不可少的。这块空间在内存栈之中,空间具体的大小视参与运算变量的大小来定。这个空间的大小也会随着隐式数据类型转换的变化而变化,举个例子,int 和 int 的计算,会在内存中开辟一个int 类型的空间,就是4个变量,如果是unsigned int 和 int 类型的计算,则会创建的变量类型是 unsigned int .以此类推,优先级有一点像隐式数据类型转换。

二、补码

​ 那么,补码究竟是怎么进行运算的呢。首先,我们有一点需要明白的是,计算机中是如何处理溢出的,溢出的处理可以参考取模的运算规则。

​ 《计算机组成原理》中的经典实例,标准时为4时,你的手表显示时间为7时,你有两个选择把表调整正确。一种是7 退 3 格,另一种是7 进 9 格。

​ 换句话说,在12进制的基础上,7+9 == 7 - 3。为什么呢,因为 (7 + 9) == (7 - 3) + 12.

​ m是能够表达的最大的数。

​ 我们假设这个模长为m , 那么我们在进行计算的时候,就可以得到下面这个式子

x - y + m == x - y

​ 二进制中,进行运算的时候

​ 所以就有:

x - y == x + m - y

=>x - y == x + m - 1 - y + 1

​ 假设我们一共有8位,那么我们所能够表达的最大的数字就是\(2^8 - 1\).我们所取得模长其实就是\(2^8\).注意一下这个模长,模长所表达的,应该是我们表达不了的最小的数字。比如2进制,表达不了的是2,12进制下,表达不了的是 12,因此,我们选取这个数字作为模长。

​ 模长 m == \(2^8\)

​ 那么 m -1 == \(2^8 - 1\) , 二进制下的表达就是1111 1111.

​ 所以 原式可以表达成

x - y

=>x + (1111 1111)- y + 1

​ 二进制下的y的表示,假设是1000 0101

​ 显然的,我们可以看到的是, (1111 1111) - (1000 0101) 的计算结果。相当于对y进行取反,我们记作~y。值得一提的是,这种运算是极快的。

​ 因此,我们计算x - y,就最终转化成为了计算x + 1 + ~y

​ 这样,通过补码,我们的减法就转换成为了加法。

posted @ 2020-12-01 19:46  关河梦断  阅读(420)  评论(1)    收藏  举报