我们自学习一门高级语言时,都要了解数据成分,可你们知道在高级语言中数据都是如何在内存中存储的吗?今天我就来介绍一下。
语言: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
通过上述一个程序例子,和这个加法的例子,我相信各位应该了解了吧。
后面的文章我会解释,为什么要存在补码形式,都用原码不是更方便吗?
各位再见。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有