E_CoderAndroid 开发技术分享首页投稿(暂停使用,暂停投稿)

从计算机为什么用补码存储数据,衍生到存储单元数据溢出

2016-05-12  本文已影响928人  xpleemoon

引言

先说几句屁话,觉得啰嗦可以忽略跳过这段屁话。
俗话说:眼看他起高楼,眼看他宴宾客,眼看他楼塌了。我想这句话放在我们做技术的,也很合适——基础不牢,地动山摇。
尽管我们很多人不是做基础开发的,但是操作系统、数据结构和算法、计算机网络、设计模式……这些IT领域的基础性学科,对于我们来说其实挺重要的,比如做优化、跨语言学习、工程框架搭建……。基础虽然不能决定眼前,但是能够决定我们在这条路上走多远。框架那么多、特效那么多,真心没有兴趣一个个都摸一遍,所以偶尔回过头去翻看这些基础性的东西是挺有意思的。

关于这个问题,相信很多教这门课的老师以及工作多年的coder也解释不清,甚至不知道这个概念。

/*char是无符号数,16位存储,表示范围是0~2^16-1(即0~65535)*/
char ch = Character.MAX_VALUE; // ch为65535
ch += (char) 1; // 加1后,引起数据溢出,则ch为0

/*int是有符号数,32位存储,表示范围是-2^31~2^31-1(即-2147483648~2147483647)*/
int i = Integer.MAX_VALUE; // i为2147483647
i += 1; // 加1后,引起数据溢出,则i为-2147483648

fuck概念

  • 没有特殊说明,本文都以4位存储单元来说明
  • 下面几个小节会提到一些关键概念,不要对这些概念恐慌,这些概念会结合例子或者对比的形式,尽量以通俗简洁的文字来说明,保证人人都能看的懂

加法器

模、补数

二进制数的模,先来看下两个个例子(此处我们忽略符号):

  1. 2位存储所能表示的最大数是11(10进制:3 = 2^2 - 1),比他大1的是11 + 1 = 100(10进制:4 = 2^2),那么这个100则是2位存储所能表示的所有数据的模。
  2. 4位存储所能表示的最大数是1111(10进制:15 = 2^4 - 1),比他大1的数是1111 + 1 = 10000(10进制:16 = 2^4),那么这个10000则是4位存储所能表示的所有数据的模。

通过对上面两个例子可以推论:一个二进制数的最高位位数用n表示,那么该二进制数的模就是2^n

原码、反码、补码

国内外教材对比.png

注意下ones' complement和 two's complement的撇号(')的位置(学过英语的都知道,撇号(')在s前和s后的含义是不一样的)

狗日的国内教材和翻译,真是误人子弟啊

计算机为什么用补码存储数据

|有符号数(十进制)|sign and magnitude representation(原码)|ones' complement representation(反码),[x]反 = (2^n - 1) - \X|two's complement representation(补码),[x]补 = (2^n) - \X|
|:-:|:-:|:-:|:-:|
|+7|0111|表示方式不变|表示方式不变|
|+6|0110|表示方式不变|表示方式不变|
|+5|0101|表示方式不变|表示方式不变|
|+4|0100|表示方式不变|表示方式不变|
|+3|0011|表示方式不变|表示方式不变|
|+2|0010|表示方式不变|表示方式不变|
|+1|0001|表示方式不变|表示方式不变|
|+0|0000|表示方式不变|表示方式不变|
|-0|1000|1111|0000(求解过程:[x]补 = 2^n - \x\ = 2^4 - \-0\ = 2^4 - (+0),使用二进制则为10000 - 0000 = 10000,超过4位(有进位),那么舍弃进位1,最终结果就是0000)|
|-1|1001|1110|1111|
|-2|1010|1101|1110|
|-3|1011|1100|1101|
|-4|1100|1011|1100|
|-5|1101|1010|1011|
|-6|1110|1001|1010|
|-7|1111|1000|1001|
|-8|超出4个bit所能表达范围|超出4个bit所能表达范围|1000|
|备注|零重码,二进制存在两种表示方法:0000和1000|零重码,二进制存在两种表示方法:0000和1111|零无重码,同时解决了原码和反码不能表示-8的问题|

two's complement wheel

从补码的角度解答代码片中的数据溢出

贴出我看的关于补码的文章链接,有几篇中文文章对于某些知识点可能说错了,切记要带着批判的观点去看:

上一篇 下一篇

猜你喜欢

热点阅读