补码
补码
一、计算机系统基础
首先,我们要明白,计算机是二进制进行存储的。归根到底,其实就是发光二极管的通断两种状态。
计算机有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。
这样,通过补码,我们的减法就转换成为了加法。

浙公网安备 33010602011771号