【C语言】整形在内存当中存储空间(原、反、补以及为什么计算机当中存储的是补码)

时间:2022-10-18 15:02:35

????write in front????   

????大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流????

????2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家博主 & 阿里云星级博主~掘金⇿InfoQ~51CTOP创作者~周榜102﹣总榜826⇿全网访问量35w+????

????本文由 謓泽 原创 发布在51CTOP 如需转载还请通知⚠

????个人主页-​謓泽51Ctop的博客​????

????欢迎各位→点赞???? + 收藏⭐️ + 留言????

????系列专栏-​謓泽51Ctop的分类_51CTO博客​????

✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本????

【C语言】整形在内存当中存储空间(原、反、补以及为什么计算机当中存储的是补码)


整形在内存当中的存储空间 

想要了解这个内容的话,我用一段代码给大家演示下:

#include<stdio.h>
int main(void){
int a = 5;
int b = -3;
}

【C语言】整形在内存当中存储空间(原、反、补以及为什么计算机当中存储的是补码)

a存储的结果

【C语言】整形在内存当中存储空间(原、反、补以及为什么计算机当中存储的是补码)

【C语言】整形在内存当中存储空间(原、反、补以及为什么计算机当中存储的是补码)

 b存储的结果

【C语言】整形在内存当中存储空间(原、反、补以及为什么计算机当中存储的是补码)

【C语言】整形在内存当中存储空间(原、反、补以及为什么计算机当中存储的是补码)

  • 大家发现了没有,这两个的存储结果是不一样的,接下来我就来告诉大家整形在内存当中是怎么存储的。
  • 其实就是先要了解原码,反码,以及补码的概念
  • 计算机中有符号数(整形)有三种表示方法分别是:原码,反码以及补码。三种表示方法都有符号位和数值位两个部分,符号位是用0表示位"正",用1表示为"负",而数值位的三种表示方法各不相同。注:无符号的原码反码以及补码是相同的????。
  • 有符号数字是分为两种的一种叫做正数,另一种叫做是负数。在正数当中是相同的,然而在负数当中这三种的表达方式就不一样了????

原码:-1

原码:1

......... 1001

0001

反码:-1

反码:1

 ..........1110

0001

补码:-1

补码:1

 ..........1111

0111

  • 上面的是负数形式三种情况,...........这个是省略如果是整形前面32位数字,注意这里最高位是1,所以是负数的三种形式。

原码

  • 直接将数字按照正数或者负数形式来转换翻译成二进制就可以了????
int a = 5;//4个字节 —— 32bit位
//0(最高位正数)0000000000000000000000000000101
int b = -3;
//1(最高位负数)1111111111111111111111111111101

【C语言】整形在内存当中存储空间(原、反、补以及为什么计算机当中存储的是补码)

其实还有一个办法可以算补码我一开始就是这样的:

1、假设是负数1的补码你先看成是负数1原码的数字—10001(注意这里的最高位是1,是负数)

2、再直接反码注意最高位不用反码了——11110

3、最关键的一步就是补码了切记补码最后一位加1是1就往前面一位数字进1,结果就是——11111

当然这个是笨办法,如果不能理解的话用这个也是可以的我一开始就是这样????

反码

将你的符号位不变,也就是最高位不变,其次再依次的按位取反,得到反码。

比如 int = - 10;的反码就是—11111111111111111111111111110101

补码

补码就是 反码+1 就能够得到补码,注意是前提是要反码加一????

还是 比如 int = - 10;的补码就是—11111111111111111111111111110110

这里注意一下是满2进1,不要弄错了~!

如果它是正数的话:原码、补码以及反码都是相同的!

是负数的话就是我上面说的这样!对于整形来说存放的都是补码,切记!

一个字节=8个bit

【C语言】整形在内存当中存储空间(原、反、补以及为什么计算机当中存储的是补码)

【C语言】整形在内存当中存储空间(原、反、补以及为什么计算机当中存储的是补码)

为什么在计算机中存储的是补码?

在计算机的系统当中,数值都是用补码来表示存储的。原因在于,使用补码,可以将符号位和数值域进行统一的处理;同时,加法和减法当中用补码也可以进行统一的处理(CPU当中只有加法器),此外,尤其是补码与原码的运算过程是可以进行相互转换的!

那么我着重的跟大家说说这个加法器吧,这个加法器其实就是当中CPU运用的加法运算,好接下来我给大家举个例子比如说:1 - 1 那你要转换成加法器怎么办呢?其实很简单只需要:1 + (-1) 就可以了,那么如果你现在要用原码来算呢?

 1的原码: 00000000000000000000000000000001

-1的原码: 10000000000000000000000000000001

    结果:    10000000000000000000000000000010      所以,1+(-1) = -2吗?答案显然不是的

好!那现在如果我们用补码来算一下呢

 1的补码:  0000 0000 0000 0000 0000 0000 0000 0001

-1的补码:  1111 1111 1111 1111 1111 1111 1111 1111 1111

0000 0000 0000 0000 0000 0000 0000 0000

但是:我们整形当中只能存储的是32位,所以留下的是0,所以用补码进行运算的时候我们是可以算出一个正确的结过的,想到这,我真的觉得当时创作出这个算法的人估计是个神仙吧????,乘法就是^几次放就加多少,也有可能是转换成某一个运算吧。但是原理都是一样的就是我只要有加法,这些事情我都可以办到。

【C语言】整形在内存当中存储空间(原、反、补以及为什么计算机当中存储的是补码)

【C语言】整形在内存当中存储空间(原、反、补以及为什么计算机当中存储的是补码)