C语言数据在内存中的存储。了解C语言的数据存储的方式是相当重要的,也就是更加偏向底层方面的东西,了解学习后可以对C语言的代码逻辑有更深刻的了解。这里我将主要介绍:
1.C语言的数据类型
2.整形在内存中的存储:原码 反码 补码
3.大小端字节序介绍及判断
C语言中的基本内置类型有:
char 字符类型
short 短整型
int 整型
long 长整型
long long 更长整型
float 单精度浮点数
double 双精度浮点数
根据以上这些再加上其他的一些类型我们又可以将类型分为5类。分别是:
1.整型
即上述基本内置类型的前5项(因为char类型的底层为ASCII码和整型的存储方式一样,占1个字节。如果是无符号类型的char类型对应的最小值为0最大值为255)
2.浮点型
float
double
3.构造类型
数组类型
结构体类型 struct
枚举类型 enum
联合类型 union
4.指针类型
对应的不同类型的指针
5.空类型
void 表示空类型
通常用于函数的返回类型,函数参数(其实就是默认的无形参的函数),指针类型(void *p)
:
int n = 1; //原码 00000000000000000000000000000001 //反码 00000000000000000000000000000001 //补码 00000000000000000000000000000001 //在内存中整型以二进制补码的方式存储 //正整数的原码,反码,补码相同 int x = -1; //原码 10000000000000000000000000000001 //反码 11111111111111111111111111111110 //补码 11111111111111111111111111111111 //反码即除符号位的其他位取反,补码则在反码的基础上+1.
对于整型来说数据在内存中存放的是补码,这是因为,使用补码存储,可以将符号位的数值域统一处理,同时加法和减法也可以统一处理(CPU只有加法器)此外虽然补码回到原码的计算是先-1再取反,但事实上同样的运算过程即再次取反+1同样可以得到原码,计算机就可以这样来处理就不需要额外的硬件电路,相当于更加规范化,同时节约了额外的开销。例如计算1-1计算机内部实际执行的是1+(-1)的操作如上图所示,1的补码和-1的补码相加得到的结果就是0。如果存储的是原码的话还需要转换到补码才能进行运算,所以直接存储补码大大的提高了计算机的运行效率。
如上图所示int的a数据在内存中的存储为14 00 00 00 (两个表示一个字节,为16进制)从这里我们可以看到因为int类型占4个字节,而给定数据20明显无法填满4个字节的大小在这样的表示情况下就占据了第一个字节也就是第一个数字14(16进制)的位置,也可以看出它是从a的内存地址开头开始的也就是0x00EFFE44 内存单元的第一位,这也就是小端字节序。而大端字节序则与之相反,高位数据保存在低位地址中,低位数据保存在高位地址中。
即如上图所示。在vs编译器中采用的是小端存储,下面附上代码来判断当前编译器采用的是小端还是大端存储
int check_sys() { int i = 1; //用正整数1来判断若是小端按照刚才的图 //在内存中因该是01 00 00 00 //反之为00 00 00 01 return (*(char*)&i); //强转用char类型指针操作,因为char类型只会移动1个字节 //若是返回1则为小端,返回0则为大端 } int main() { int ret = check_sys(); if (ret) { printf("小端\n"); } else { printf("大端\n"); } }