存储过程计算1到100_计算机的数值表示

上下文约束

默认围绕8位计算机展开讨论。

问题

在进入正文之前,先提三个问题:

  1. 计算机中的数为什么用补码(2's complement)来表示和存储?
  2. 补码的计算规则是怎么来的?
  3. 计算机是如何区分unsigned int和int?

众所周知,二进制是一种记数系统(类比十进制),而补码就是该系统之上的编码协议。协议是为了无序信息流变得规整,让人能够控制它。从这方面猜测,补码产生的原因是为了最小化硬件设计的成本,这大概也是最初的软件定义硬件(SDH)。

当我们想象比特流的存储过程时,不免好奇自己头脑中的数值概念(尤其是负数和小数)怎么被计算机编码成有意义的比特流?这些比特流如何被正确地计算成另一种比特流?在更高层次上,编程语言中的short, int, unsigned int, long, long long等数值类型是怎样被计算机正确地识别的?

通常,协议是处理复杂度的好方法,但隐藏在协议背后的原因比它本身更有探索的价值。如果你也感同身受,那么阅读下文就是合适的。

为什么用补码?

概念解释

  1. 原码[1](True form)
    原码是指一个二进制数左边加上符号位后所得到的码,且当二进制数大于0时,符号位为0;二进制数小于0时,符号位为1;二进制数等于0时,符号位可以为0(+0)或1(-0)。
  2. 反码[2](One's complement)
    反码是带有符号位的二进制数表示;负数的反码是将其对应正数按位取反,正数和0的反码就是该数字本身。
  3. 补码[3](Two's complement)
    补码也是带有符号位的二进制表示;负数的补码是将其对应正数按位取反再加1,正数和0的补码就是该数字本身。

三者的关系很密切,是1对1的单射关系。准确地说,补码下可表示的最大负数没有对应的原码和反码。具体原因,待会儿做详细讨论。

从实际应用的角度提问,现代计算机中数据的存储形式是原码、反码还是补码?这个问题其实可以规约到另一个问题上——哪种存储形式最有利于计算机进行运算?从这个角度思考就不难得出答案,当然是补码,不然,要是原码和反码都够用,为啥设计出补码?

那么,为什么原码和反码不够用?单独从数据表示来看是无法得出结论的,需要从计算的角度思考。我们都知道,二进制是以2为基数的记数系统,和十进制、六十进制的记数本质相同。在最开始,记数系统中是没有负数的,引入负数是为了统一概念相反的事物。比如:收入和支出,支出就可以视为负的收入。如果用恒等式表达收支平衡收入 = 支出,将支出移项到左边就得变号收入-支出 = 0,换句话说,收入+(-支出) = 0,此时表达了总收入为0这个事实。相同的概念对于运算的意义重大,以前需要设计减法的运算规则,现在用加法规则就可以替代。在人类看来,这意味着概念的统一,而对于计算机而言,这简化了ALU(算术逻辑单元)中集成电路的设计。

既然如此,负数在二进制中的表示就尤为重要。按照原码的定义,-1的二进制表示是1000 0001,那么计算<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值