浅聊补码
今天查资料遇到了补码的概念,可惜已经把专业课老师传授的知识忘得七七八八了,就上网查了下补码的资料,讲解五花八门,读了半天总感觉还是没有关联上自己的知识结构。最终还是从《深入理解计算机系统》上寻求一个精准的答案。
阅读说明
笔记来自我自己的阅读理解。并不照搬神书内容,有兴趣的朋友可以阅读《深入理解计算机系统》2.2节,形成一个完整的知识体系。
在梳理概念前,先说下用到的概念:
1. 最高有效位
这里举个简单的例子,十进制数字123,它的最高有效位就是百位的1; 十进制数字54321的最高有效位就是万位的5;通过这两个简单的例子,最高有效位就很好理解了。
2. 最高有效位的权重
这里也很简单,123中最高有效位的值是1,权重就是100。当然,补码这块主要讲的是2进制,如二进制数1011 1100,共8位,最高有效位是1,最高有效位的权重就是2^7。
所以补码到底是什么呢?
补码的在CS领域主要作用是用于表示负数,可能有别的用法我还不清楚,但这里主要记录其表示负数的用法。补码的值就是 (-1) * 最高有效位 * 最高有效位的权重 再加上其他位的值。
对于一个普通的二进制数字 1010 1100来说,它的值等于(1*2^7 + 0* 2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 0*2^0)
对于该二进制,它的补码值和它的差别只有最高有效位的值。即 -1*1*2 ^7,原数字前乘上 -1,再加上剩余部分( 0* 2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 0*2^0)。
这样就解释了有符号数的取址范围为什么负数总比正数多一位,如char的取址范围为 -128 ~ 127。
众所周知,char 1字节,8bit。如下
1000 0000 表示 -128,即 -1 * 1 * 2^7
0111 1111 表示127
对于,short,int,double都是同理
标签:权重,二进制,补码,cs03,负数,有效,最高 From: https://www.cnblogs.com/cpp-muggle/p/16867744.html