首页betway必威体育app官网 › 从电脑为什么用补码存储数据,衍生到存储单元数据溢出

从电脑为什么用补码存储数据,衍生到存储单元数据溢出

引言

预先说几词屁话,觉得啰嗦可以忽略跳了就段屁话。
俗话说:眼看他起高楼,眼看他宴宾客,眼看他楼塌了。我思马上句话在我们举行技术之,也酷得体——基础不结实,地动山摇。
尽管我们许多人口未是举行基础开发的,但是操作系统、数据结构和算法、计算机网络、设计模式……这些IT领域的基础性学科,对于咱们来说实在很重要之,比如举行优化、跨语言学习、工程框架搭建……。基础则非克控制前,但是会控制我们当马上条路上走多远。框架那么多、特效那么多,真心没趣味一个个且摸一遍,所以有时回过头去翻看这些基础性的物是老大好玩的。

  • 是不是还记得在模仿操作系统的时光,很迷惑计算机为什么要因此补码存储数据,而无是故我们人重复爱懂的原码来展开仓储吗?

有关这题目,相信广大令这门课的教育工作者跟工作多年的coder也讲不根本,甚至无知晓此定义。

  • 正文将尝试从理性结合感性的角度去验证处理器为什么用补码存储数据,当我们知晓这题目后,那么,我们便可以去理解外一个衍生问题——数码溢出。我们事先来拘禁无异段关于数据溢起的Java代码片:

/*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各项存储单元来验证
  • 脚几乎单稍节会提到有根本概念,不要对这些概念恐慌,这些概念会结合例子还是比的形式,尽量以浅显简洁的字来证明,保证人们都能看之晓

加法器

  • 处理器只有加法器没有减法器,两单数的减法运算会叫电脑转换为加法运算。(先盖个伏笔——通过补码进行表示,即可将减法运算转换为加法运算)

模、补数

  • 以日常生活中,有诸多改为减为加点例子。我们盖最平凡之时钟为例,时针逆时针拨x(0<x<12)格和时针顺时针拨12-x格,效果是均等之。比如,时针从10接触调整到5接触来以下简单栽办法:

    1. 时针逆时针拨5格,相当给做减法:10 -5 = 5
    2. 时针顺时针拨7(即12 - 5)格,相当给做加法:10 + 7 = 12 +5 =
      5(MOD=12)
  • 总,x + (MOD - x) = MOD就是模,x和MOD -
    x就是千篇一律针对性“互补”的累累,即原数x的补数为MOD - x或者原数MOD -
    x的补数为x。通过对钟表拨时针的事例可以发现,用补数(7)代替原数(5),可拿减法转变也加法(出现的进位就是模,进位舍弃)。

其次迈入制数的型,先来拘禁下零星单单例(此处我们忽视符号):

  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

原码、反码、补码

  • 预先来拘禁一样张国内外教材相比的表明(出自《计算机教育》2015年第10冀的稿子——《原码、反码和补码的教学讨论》)

国内外教材对比.png

留意下ones' complement和 two's
complement的撇号(')的职位(学过英语的还掌握,撇号(')在s前跟s后之意思是休一样的)

  • 给一定一个起记号数x,来对待下国外与国内教材对原码、反码、补码的象征:

    • 国外教材
      • sign and magnitude
        representation(原码):最高位位符号各类(0意味着正数,1意味负数),剩余位(数据各项)为x的轻重。
      • ones' complement
        representation(反码):如果x为正数,则是该二进制表示;如果x为负数,则是那相应正数的bit
        complement/bitwise
        NOT(按位取反)——执行诸一样各项逻辑否定的相同老大操作。可用公式表示为:

        • [x]反 = (2^n - 1) -
          |X|(其中n为将标志位算在内的位数,|X|为绝对值)
      • two's complement
        representation(补码):如果x为正数,则是该二进制表示;如果x为负数,则是那相应正数的亚之上(所有位取反后加1)。可用公式表示为:

        • [x]补 = (2^n) - |X| = [x]反 +
          1(其中n为将标志位算在内的位数,|X|为绝对值)
    • 境内教材
      • 原码:最高位吗标志位,剩余位(数据个)为x的绝对值。
      • 反码:如果x为正数,则跟原码相同;如果x为负数,符号位保持不换,数据位取反。
      • 补码:如果x为正数,则跟原码相同;如果x为负数,符号位保持无变换,数据位取反,然后加1(若符号位有进位,则放弃进位)。
  • 比国内外教材的发挥,是否察觉高下立现:

    • 境内教材画蛇添足,并且爱引起误会:
      1. 原码是反码和补码的基础,反码和补码由原码转化而来
      2. 原码、反码和补码的符号位相同
    • 海外教材,则不行浅显:
      1. 求解一个频之反码和补码,根本未待掌握原码,直接通过它的简单单针对许公式即可,甚至足以说原码与反码和补码没有半毛钱关系,反倒是反码和补码存在涉嫌——补码
        = 反码 + 1
      2. 原码的角度是符号的象征(符号各项),即用0表示正数,用1意味负数;反码和补码的出发点是减法的演算,即用单薄独正数的加法取代两个数之减法

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

微机为什么用补码存储数据

  • 点铺垫了马上门久,终于要跻身第一个主题——计算机为什么用补码存储数据。为了不招混淆,我们就算以国外教材对原码、反码和补码的象征拟来进行认证。简单起见,以4员存储表示有记号数也例,通过原码、反码和补码的象征法来大成一摆放表:

|有记号数(十进制)|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
    representation)可以防止0的机器数重码,同时又化解了原码和反码无法代表-8之问题
    ,这样即便大幅度的简化了计算机的硬件设计。

  • 成之前提到的时钟例子,我们管补码表示法(two's complement
    representation)所代表的季号存储单元,按照从0000届1111递增的方式,均匀的遍布于钟的表盘上。于是,我们尽管足以得到下面这张图(图片来源于这里):

two's complement wheel

  • OK,继续为时钟的主意来观上图:

    • 顺时针方向各类加法,逆时针方向呢减法
    • 模为2^n:在1111处顺时针拨一格,就到了0000。用数学之计,即1111 +
      1 =
      10000,进位舍弃则结果吧0000,那么四号存储的型就是是10000(2^4)
    • 减法转换为加法:3 - 1 = 3 + (-1) = 0011 + 1111 =
      0010,眼尖的人或会见说0011 +
      1111分明相当10010,怎么会是0010?还记之前提过的万丈位进位舍弃嘛,因此于4各项存储来说,进位舍弃后虽是0010
      = 2。

      假设减法不转移为加法,那么3 -1 = 0011 - 0001 = 0010 = 2

    • 数据溢出:当0111(7)加1时,按照我们人的思索来说,应该结果也8,但是对于机械来说则免是,因为0111(7)是四各存储所能代表的极其充分出标志数,所以其是无能为力代表01000(8)的,这个时刻我们即便说数目溢起了。那么数量溢起该怎么处置为?很简短,机器的构思方式一目了然跟我们人脑不等同,机器仍地方环形图的不二法门,由于0111(7)加1是顺时针造成的多寡溢起,那么我们可以拿机器的操作想象成在0111(7)处顺时针拨了一格,我们又夺对待下环形图发现这指向了1000(-8)。

      把此过程想象变为拨时针就OK了,对于1000(-8)减1也是一模一样道理

  • 时至今日,我们了可以总结一下,并解答计算机为什么用补码存储数据:

    1. 处理器只有加法器没有减法器,两单数的减法运算会于电脑转换为加法运算,而补码正好能解决减法转换为加法的题目
    2. 防机器发出零重码,同时缓解了原码和反码不克表示-8之问题,这样翻天覆地的简化了计算机的硬件设计
    3. 因巡回的方化解数据溢起底问题

打补码的角度解答代表码片中的数量溢出

  • 既然如此已清楚了电脑为什么用补码存储数据,那我们不怕可以回过头去扑灭文章开始的多寡溢起之代码片了。由于代码片中ch和i的问题是平等的,那我们即便挑选ch来拓展辨析,另一个雁过拔毛你们分析。

  • 于Java中,char也无符号数,16各类存储,表示范围是0~2^16-1(即0~65535)。

    1. 先是,我们本0000 0000 0000 0000到1111 1111 1111
      1111递增的艺术,均匀的布在钟的表盘上,图虽未打了,自己在脑子中想象一下或者打个草稿。
    2. 然后,找来多少溢起点,通过观察char环形图可以发现数溢出点是0(0000
      0000 0000 0000)和65535(1111 1111 1111 1111)
    3. 最后,我们的ch = 65535 +
      1,那么稀明显起了数码溢起,按照拨时针的道就是可得出ch = 0
  • Perfect,是否解答了当初学操作系统及编程的早晚,困扰你们好老的问题。送给大家一样句话:有些概念可能这未理解,但是随着阅历多累和回忆的大都了,自然而然就知晓了。

贴起自我看之有关补码的篇章链接,有几乎首中文文章于某些知识点可能说错了,切记要带动在批判之见识去押:

  • 《深入明计算机体系》第二节
  • 《计算机教育》2015年第10可望的章——《原码、反码和补码的教学讨论》
  • 补码原理的私有掌握
  • 何以计算机用补码存储数据?
  • 原码、反码和补码
  • 补码
  • Class #7 - Signed Binary Numbers, Subtraction and
    Overflow

转载本站文章请注明出处:bway883.com https://www.piworx.com/?p=1673

上一篇:

下一篇:

相关文章

网站地图xml地图