cs03_补码、反码和原码

浅聊补码

  今天查资料遇到了补码的概念,可惜已经把专业课老师传授的知识忘得七七八八了,就上网查了下补码的资料,讲解五花八门,读了半天总感觉还是没有关联上自己的知识结构。最终还是从《深入理解计算机系统》上寻求一个精准的答案。

阅读说明

  笔记来自我自己的阅读理解。并不照搬神书内容,有兴趣的朋友可以阅读《深入理解计算机系统》2.2节,形成一个完整的知识体系。

 

在梳理概念前,先说下用到的概念:

  1. 最高有效位

    这里举个简单的例子,十进制数字123,它的最高有效位就是百位的1; 十进制数字54321的最高有效位就是万位的5;通过这两个简单的例子,最高有效位就很好理解了。

  2. 最高有效位的权重

    这里也很简单,123中最高有效位的值是1,权重就是100。当然,补码这块主要讲的是2进制,如二进制数1011 1100,共8位,最高有效位是1,最高有效位的权重就是27

 

 

  所以补码到底是什么呢?

    补码的在CS领域主要作用是用于表示负数,可能有别的用法我还不清楚,但这里主要记录其表示负数的用法。书中原话: 术语补码来源于这样一种情况,对于非负数x,我们用2w - x (这里只有一个2)来计算 -x 的 w 位表示

    解释下几个变量的含义: 对于非负数x,x这里可以是0,1,2,3,4,5……任意的数字,补码的含义就是要表示它的对应负数的表示。

    w的含义是多少位的二进制,如 w=8,x=6时,如果我们想表示-6,就要用补码来表示:28-6 == 256 - 6 = 250 ==> 1111 1010 

  那么补码的值怎么计算呢?

    我们知道了用补码表示一个非负数的负值,那么它的值是怎么计算的呢?

    补码的值就是  (-1) * 最高有效位 * 最高有效位的权重 再加上其他位的值。 

    对于一个普通的二进制数字 1010 1100来说,它的值等于(1*27 + 0* 26 + 1*25 + 0*24 + 1*23 + 1*22 + 0*21 + 0*20)

    对于该二进制,它的补码值和它的差别只有最高有效位的值。即 -1*1*27,原数字前乘上 -1,再加上剩余部分( 0* 26 + 1*25 + 0*24 + 1*23 + 1*22 + 0*21 + 0*20)。

    代入上述的-6,计算下 1111 1010 ==> -1 * 128 + 64 + 32 + 16 + 8 + 0 + 2 + 0 = -6

    

    这样就解释了有符号数的取址范围为什么负数总比正数多一位,如char的取址范围为 -128 ~ 127。

    众所周知,char 1字节,8bit。如下

    1000 0000 表示 -128,即 -1 * 1 * 27

    0111 1111 表示127 

    对于,short,int,double都是同理

 

反码: 反码和补码的区别就是最高有效位的权重不一样,补码很好理解最高有效位的权重是  -2(w-1) ,而反码的最高有效位的权重是 -(2(w-1) -1),书中原话: 除了最高有效位的权是 -(2w-1 - 1 ) ,而不是-2w-1,它和补码是一样的

 

原码:书中原话: 最高有效位是符号位,用来确定剩下的位应该取负权还是正权

 

补充

虽然过去生产过基于反码表示的机器,但是几乎所有的现代计算机都是用补码。

所以这篇笔记主要介绍补码,反码和原码一笔带过,想详细了解的朋友可以阅读《深入理解计算机系统》 2.2节

posted @   cpp-muggle  阅读(103)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示