前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二进制源码和补码的基础解释

二进制源码和补码的基础解释

作者头像
小明爱学习
发布2020-08-10 14:33:02
8920
发布2020-08-10 14:33:02
举报
文章被收录于专栏:smh的技术文章smh的技术文章

二进制

我们知道,计算机最终处理的都是0和1的二进制的数据,二进制又分为有符号数和无符号数,今天就带你们详细了解一下。我会以代码为例子让各位更清晰的明白,所用语言为C#语言。

无符号数

所谓无符号数就是没有符号的数,数有正负之分,但是只有负数的时候才会有符号,所以无符号数就是正数。

无符号数不用考虑正负,所以数中的每个二进制数都是用来表示数值的。

下面请看代码:

代码语言:javascript
复制
UInt16 decimals = 2767;
string binary = Convert.ToString(decimals,2);
Response.Write("Data:<span>" + binary + "</span><br/>");
Response.Write("Length:"+binary.Length);

首先我定义一个了一个16位无符号整数的变量decimals,赋值为2767,然后转成二进制形式,并打印了出来,结果如下:

这里大家应该都看得懂,2767这个十进制转成二进制就是上述图片中的二进制数字。

有符号数

所谓有符号数就是有正负的数,可以是负数了,所以在二进制的数字中,我们就拿最高位的数字用来表示正负,0表示正,1表示负。

下面请看代码:

代码语言:javascript
复制
        Int16 decimals = 2767;
        string binary = Convert.ToString(decimals,2);
        Response.Write("Data:<span>" + binary + "</span><br/>");
        Response.Write("Length:"+binary.Length);

这跟上述的唯一区别就是这次我定义的是有符号的16位整数,然后我们接着来输出看看结果。

从表面上看是一样的,实质上是不一样的,第一个是无符号整数,输出的是源码,第二个我们有符号整数,输出的补码。但是由于正数的源码和补码是一样,所以我们看到的是一样的。

这里C#语言给我们省略了4个0,实际上完整的Data应该是:0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1。

最高位就是符号位为0,就是正数。

负数的情况

代码语言:javascript
复制
Int16 decimals = -3;
string binary = Convert.ToString(decimals,2);
Response.Write("Data:<span>" + binary + "</span><br/>");
Response.Write("Length:"+binary.Length);

输出结果:

这里,输出的补码,源码转补码的步骤是:首先是求出3的源码是:1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1

然后把这个源码全部取反,0变1,1变0,符号位不变,变成:1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0,然后在加1得到:1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1得到补码。

说到这里,那补码有什么用呢?

补码是在源码的基础上取反加1,那么想想,比如3-2,就可以改为3+(2的补码),这样就把减法变为了加法,在计算机中,加法比减法在计算机中效率高很多。

这里我们四位来模拟演示:

首先求出3的源码为:0011 然后求出2的补码为:1110

然后0011+1110等于0001,0001转为10进制就为1,这样就把减法转为了加法。

这里加法可能大家会求出10001,前面那个1是符号位的进位,需舍去

如无作者授权,请勿转载。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020年08月07日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二进制
  • 无符号数
  • 有符号数
  • 负数的情况
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档