CSAPP学习感悟:原码反码与补码,有符号与无符号数

发布时间:2022-07-05 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了CSAPP学习感悟:原码反码与补码,有符号与无符号数脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

开始慢慢听一点CSAPP的网课,目前还没有摸清楚书的主线和架构 ,甚至还没有把网课和课本很好的对应起来,所以暂时不打算做系统性的笔记,只记录一点有启发的点。

国内不少教程学习原码、反码与补码时,通常从无符号数讲起 ,先讲原码由二进制导出,随后讲到有符号数,将最高位定义为符号位,显然表示的总信息量不变,那么数据的总范围也应该大体不变,很清楚的看到能表示的数据范围发生了类似平移的变化。随后讲解将最高位为1定义为负数,此时便有些牵强的意味了。随后再讲原码反码补码的转换,再讲机器内以何种方式存储(正数原码,负数补码,而不讲清楚其中原因,由是便里雾里,再不知为何。CSAPP网课的讲解方式给了我新的启发。

  • 定长的码位表示的信息量理应相同
  • 有符号数与无符号数最大的区别是范围和采用哪种编码

故而直接地,我们想到应该平移范围。以一个字节举例,能表示的无符号数范围为0~255,共256个值。如果转为有符号数,理想状态下也应该能表示这么多个数,范围应该为-128~127。至于为何不是-127~128,鉴于无符号数和有符号数在表示正数时的方法应当保持最大程度的一致性,故而想要表示128应该需要8个bIT,这显然侵犯了存放符号信息的空间。

这样我们便发现了两者范围之间的差别:最小值相差-128,也即最高位上的一个1。这就是为什么最高位是符号位,且正数是0,负数的1的最根本原因。

为了存放这个符号信息,我们希望将最高位按不同于二进制的方式定义。不定为+128而定为-128,这样便实现了范围的转换。然而不妙的是,范围的平移并非反射,也不是像十进制加一个符号那样简单。例如表示-128的编码理应为1000 0000,而当我们读取符号位以外的内容,我们将发现:他代表0,而不是去掉十进制符号之后剩下的数字128。设置最高位的特殊运算法则是机器理解有符号负数编码的方式,可这与我们习惯的十进制的表达方式大相径庭。为了保持此处的统一,反码和补码出现了——

  • 我们将最符合人类直观的方式定义成原码:最高位表正负,后续位表示数字。
  • 对正数,没有必要引入这一套复杂的体系,因为直接计算即可实现binary2decimal,故他的反码补码都是本身。
  • 对负数,反码符号位保持不变,而其余位是原码的非。这一套编码在实现计算的时候其实已经可以被解析了,但他离我们一开始提出的平移方案还有一点距离,因为在负数的原码中,本身就存在一个缺陷:
    • 0000 0000已经在正数的编码中表示0了,我们默认也是这样处理0的,虽然0既不是正数也不是负数。
    • 那么1000 0000呢?按翻译规则,他应该被译为-0,虽说在数学上-0=+0,但是一方面这违背了编码一一对应的原则,另一方面也发生了信息空间的浪费。
  • 为了修正这个错误,补码出现了,他是反码+1,当然是二进制的1,加在最低位,这也成就了原码与补码之间复杂的转换方式,但实际上,由于正数固定不动而对负数作此处理,相当于将-127~127的范围扩充到了预定的-128~127。同时,补码恰好能够满足最早定义的机器处理方式——仅将最高位处理成减法就可以了。

为什么补码能符合预期呢?显然不是巧合,这其中一直是信息的表示范围与利用引导着我们的调整。在负数的原码里,后七位表示的数为i,则其反码中表示的为127-i,如果直接将最高位的1翻译成-128,得到的将是-i-1而不是预计的-i,故而补码的加一原理出现了。这是除了表示范围的调整外,补码定义的另一个解释方式。

总而言之,在不同的编码规则与适应场景里打转的我,在bryant教授写下最高位的-16时(他的示例是五位)豁然开朗。计算机种种复杂的处理方式与技巧其实都在做翻译工作:架起人与机器的桥梁。原码是人能理解的,补码是机器能理解的(事实上,由于正数的原码和补码一致,且最高位符号位是0,故机器完全可以采取一样的处理方式,这就大大简化处理器的设计),反码则架起了他们之间的桥梁。在这套编码体系中,两种数据类型,三种(准确的说,包括无符号数最高位计入的方式,应当有四种,但那不是本文重点)编码方式,三段表示范围联系在一起,一边展现着设计者的思路,一边为人和机器打开了交流的窗口和无限的可能。令人拍手默叹。

脚本宝典总结

以上是脚本宝典为你收集整理的CSAPP学习感悟:原码反码与补码,有符号与无符号数全部内容,希望文章能够帮你解决CSAPP学习感悟:原码反码与补码,有符号与无符号数所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。