C语言进阶——数据在内存中的存储

C语言进阶——数据在内存中的存储

首先要知道,我们所有的东西都在内存中存储着,不管数据还是什么,计算机内,以32位操作系统为例,一个存储单元是一个字节,8位,2位16进制数,每个存储单元都有着对应的地址,也就是8位16进制数的编号。
当我们要存储数据时,例如:

int a=0x12345678//十六进制

那么存储的时候是应该12 34 56 78存储呢,还是应该78 56 34 12存储呢?
这就牵扯到大小端模式了。所谓大端模式,就是低地址存高数据位,高地址存低数据位;小端模式正好相反。而我们的计算机是小端模式存储,那么要怎样验证呢?

int a=0x12345678;
char *p=(char*)&a;
printf("%x\n",*p);

在这里插入图片描述
因为78为低数据位,而a为4个字节,p为char*类型指针,指向char类型数据,只能解引用1个字节,所以结果为78,即计算机存储方式为小端模式。
接下来,就是基本数据类型所占字节数

char //1字节
short//2字节
int//4字节
long//32位为4个字节,64位为8个字节
long long//8字节
float//4字节
double//8字节

整形数据,我就以int类型为例,4个字节,32位(最高位为符号位):

//有符号整形
int a=10;
int b=-1;

因为a为正数,所以存储方式为对应的二进制码,不够32位就补0:
10对应的原码:0000 0000 0000 0000 0000 0000 0000 1010
对于b来说,b为负数,所以要注意,负数在内存中存储是以补码形式存储的,为什么呢?因为计算机中没有减法一说,为什么这么说呢,例
1:0000 0000 0000 0000 0000 0000 0000 0001
-1:1000 0000 0000 0000 0000 0000 0000 0001
按理来说加下来1+(-1)=0,但是加下来发现,实际上是等于-2的,但是计算机还是1-1=2,这就是因为计算机中存的是负数对应的补码。
补码怎么算呢?记住:原码->反码->补码
反码=原码除符号位之外按位取反
补码=反码+1
-1原码:1000 0000 0000 0000 0000 0000 0000 0001
反码:1111 1111 1111 1111 1111 1111 1111 1110
补码:1111 1111 1111 1111 1111 1111 1111 1111

//无符号整形
unsigned int a=1;

无符号整形和有符号整形的区别是无符号整形的最高位不再是符号位,而是数值位。
另外,最要注意的就是浮点类型了,这里以float类型为例:

float a=10.5f

整数部分对应二进制:10->1010
小数部分对应二进制:0.5->0
所以10.5对应二进制为1010.0=1.0100*2^3指数为3,又由于指数可能为负数,已经有了一位符号位,所以统一规定指数位存指数+127后的二进制数。3+127=130->1000 0010

符号位(1位) 指数位(8位)
0 1000 0010
尾数(23位)(不够后面补零)
0100 0000 0000 0000 0000 000

所以最终结果为:
0100 0001 0010 0000 0000 0000 0000 0000
所以浮点型数据和整型数据存储是两回事,一定要注意!!!!!!

猜你喜欢

转载自blog.csdn.net/qq_45841205/article/details/109860800