zoukankan      html  css  js  c++  java
  • 二补数了解一下XD

    方才看刘汝佳的粉书的时候,提到了补码表示法,然后我就想起来了之前一个没想通的问题,那就是 -128在电脑中怎么表示?
     以8bit机器为例,我们知道,在计算机中是没有符号的,因此产生了用数字来表示符号位的做法,即正0负1,这种方法极大的方便了我们去看和理解,但是却苦了计算机。
     为什么这么说呢,我举个栗子: + 1 + (- 1) = ? , 明眼人一看就知道答案是0,可是对于计算机来说,是这样吗? 用正0负1的表示法:0000 0001 + 1000 0001 = 1000 0010 = -2。诶~答案不对(没想到吧!.jpg)。为了弥补这种缺陷,于是便出现了反码(正数的反码=原码,负数的反码在原码的基础上,符号位不变,其余按位取反)。那么用反码再来计算一下 0000 0001 + 1111 1110 = 1111 1111,刚好,在反码表示法中1111 1111表示的是(-)0。这样计算结果就对了。
     你以为这么简单就结束了?naive,看上面的式子,有没有发现0前面还有个负号,0怎么可能还分正负呢。我们初一数学第一课教的就是正数,负数,0。于是,为了应对这种情况,人们又想出来一种表示方法 --- 补码。
     这里先歪一下题(可先跳过):我们都知道补码是在反码的基础上+1(针对负数),那么有没有想过它是怎么来的?一味的记结论可不行,我这里依旧举个栗子,帮助各位理解一下(其实是捋一捋自己的思路),-8怎么表示(仅限8bit)? 按照正常的方法,肯定直接是(1000 1000),那么我们换一种思路,用 0 - 8。0000 0000 - 0000 1000。发现不够减,怎么办?小学没学过借位啊。借一位就是了,你可能会问,哪来的位给你借?诶~此言差矣,我们就先假设有位给你借(实际上这就是补码的由来),那么有位了就可以计算了:
     1 0000 0000  -  0000 1000  =  1111 1111  +  1  -  0000 1000 = 1111 0111 + 1  =  1111 1000 ,实际上,这个答案也就是-8的补码表示了。
     回到补码来说,它的存在,使得正负0合并成了一个0。举个栗子(栗子:我累~别举了),还是上面的+1 + (-1) = 1111 1111 = (-) 0,现在有了补码,我们在答案的基础上+1 , 结果是什么呢 ?1111 1111 + 1 = 1 0000 0000,有9bit,这个计算机只是个8bit机器,因此最高位丢掉(溢出了),剩下的就是0000 0000,也就是0,这下没有正负了,也正常了。但是,有得有失嘛,根据宇宙中一切守恒的定律,我们在8bit机器上多出了个-128,这个数字在计算机中的补码表示正是1000 0000。
     这样,就明白了为什么8bit表示的范围是从 -128 ~ +127, 而不是 - 127 ~ + 127。
    我应该去看看深入理解计算机系统的。emmm。
     以上。

    原来人类的悲欢并不相通, 我只觉得他们吵闹。
  • 相关阅读:
    bzoj3224 普通平衡树
    bzoj 1067 分情况讨论
    bzoj 1269 bzoj 1507 Splay处理文本信息
    bzoj 2733 Splay 启发式合并,名次树
    bzoj1502 simpson求面积
    b_lq_晚会界面单(线段树维护区间最大值表+预留m个位置)
    a_lc_统计子树中城市之间最大距离(枚举子集 + floyd / 2*dfs 求直径)
    b_lq_城市建设 & 公路修建水题 & 新的开始(虚拟结点+MST)
    b_lg_无线通讯网 & 北极通讯网络(问题转化+kruskal)
    b_lg_搭配购买(并查集+01背包)
  • 原文地址:https://www.cnblogs.com/zhlabcd/p/8542219.html
Copyright © 2011-2022 走看看