脚本宝典收集整理的这篇文章主要介绍了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。设置最高位的特殊运算法则是机器理解有符号负数编码的方式,可这与我们习惯的十进制的表达方式大相径庭。为了保持此处的统一,反码和补码出现了——
为什么补码能符合预期呢?显然不是巧合,这其中一直是信息的表示范围与利用率引导着我们的调整。在负数的原码里,后七位表示的数为i,则其反码中表示的为127-i,如果直接将最高位的1翻译成-128,得到的将是-i-1而不是预计的-i,故而补码的加一原理出现了。这是除了表示范围的调整外,补码定义的另一个解释方式。
总而言之,在不同的编码规则与适应场景里打转的我,在bryant教授写下最高位的-16时(他的示例是五位)豁然开朗。计算机种种复杂的处理方式与技巧其实都在做翻译工作:架起人与机器的桥梁。原码是人能理解的,补码是机器能理解的(事实上,由于正数的原码和补码一致,且最高位符号位是0,故机器完全可以采取一样的处理方式,这就大大简化了处理器的设计),反码则架起了他们之间的桥梁。在这套编码体系中,两种数据类型,三种(准确的说,包括无符号数最高位计入的方式,应当有四种,但那不是本文重点)编码方式,三段表示范围联系在一起,一边展现着设计者的思路,一边为人和机器打开了交流的窗口和无限的可能。令人拍手默叹。
以上是脚本宝典为你收集整理的CSAPP学习感悟:原码反码与补码,有符号与无符号数全部内容,希望文章能够帮你解决CSAPP学习感悟:原码反码与补码,有符号与无符号数所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。