一个变量在内存中是如何存储的

浏览量:328 计算机原理

我们自学习一门高级语言时,都要了解数据成分,可你们知道在高级语言中数据都是如何在内存中存储的吗?今天我就来介绍一下。

语言:C++

int c=-123;

这只是一个简单的定义了一个变量,变量名为c,值为-123。

然而我们大家应该都知道,计算机存储数据都会以二进制的形式来存储。

然后一个int在一般情况下都计算机都占4个字节,也就是32个bit。某些比较老的编译器int只占16个bit。

其次这还是一个有符号的int类型,所谓有符号,就是这个int可表示负数。因为有符号,所以必须拿出一个bit来当作符号位,那么表示数据的位数也就只有31位了。

转换过程:

首先确定符号位,这是一个负数,所以符号位为1,在数据最前面,然后把123转为二进制为:1111011,123占了7个bit,还剩下24个bit都用0补齐。


得出的原码就是:



通过原码得到反码,反码就是在原码的基础中,取反,如果原码的值为0,就变为1,如果值为1就变为0,符号位不变。



最后通过反码得到补码,补码就是在反码的基础加1即可。


然后变量c在内存就占了四个字节,对应的就是上面的补码。


然后接着谈无符号的int。

unsigned int c=123;

要声明一个无符号的int变量,只需要在int前面加上unsigned即可,这样这个int变量只能表示正数,不能表示负数,这样就不用单独拿一个bit出来当作符号位,这样32个bit都用来表示数据,所以无符号的int型可表示的正数范围也更大。

转换过程:

这是无符号的类型,所以不需要确定符号位,直接把123转为二进制为:1111011,占用了7个bit,其余的25个bit用0补齐。

得出的原码就是:


这里说明一下:如果是无符号数,即原码就是补码,不需要和有符号数那样进行多次的转换,内存中存储的就是原码。

用例子来证明一下:


变量test为无符号int变量,变量test1为有符号int变量,变量test2为无符号int变量。

然后把12和-13相加,很明显大家都知道是-1,但是我们来看看结果:


结果却不是-1,我们来分析一下。

首先-13加12肯定是-1,因为有负号,所以是一个有符号int型的数值。

所以就要求出这个数的补码,我上面说过,有符号数,在内存中存储的都是补码。

首先是一个符号,符号位为1,然后1的二进制就是1,还剩下30个bit用0补齐。

得到原码:


然后根据原码得到反码(过程上面有,不在赘述):


然后根据反码得到补码:


由于我们test2是一个无符号的int型变量,所以他就把这个32个1直接转为了10进制,也就是


看到这里,我相信大家应该明白了变量是如何在内存中表示的,以及有符号和无符号变量的区别了吧。

注意:只有当数值为负数时,在内存中才会存补码形式。

比如:int i=124;

虽然我定义的一个有符号型的int变量,但是由于i是一个正数,所以在内存中的存储形式为原码:


唯一和无符号不同的是,就是最高位是符号位,不能用于来存储数值。

我们用二进制的形式来做个加法,让各位更直观的理解。

-15+10=-5;

这里我只有8个bit来表示。

首先把-15转为补码为:11110001,然后10的补码(也就是原码,因为10是正数):00001010


得到的二进制结果就是


由于最高位是1,所以是个负数,所以这就是个补码的形式的二进制,我们需要将补码转为原码,才可以得到最后的结果。

补码转原码的方法跟上述一样,先取反,然后加1,得到: 0 0 0 0 0 1 0 1,转为十进制就等于5


通过上述一个程序例子,和这个加法的例子,我相信各位应该了解了吧。

后面的文章我会解释,为什么要存在补码形式,都用原码不是更方便吗?

各位再见。

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

评论区:

#1楼 2020年05月11日 Web前端之家
可以的,学习了 Web前端之家https://www.jiangweishan.com
回复 
昵称:
内容:
验证码:  4233

QQ群:477600139

今日头条:前端开发梦工厂

腾讯云社区:小明爱学习

微信公众号:霓虹国的佛系少年