当前位置 博文首页 > 是琳琳呀!的博客:深度剖析数据在内存中的储存
先从数据类型开始入手:
数据类型包括整形,浮点型
整形:
char
------unsigned char
------signed char
short
------unsigned short
------signed short
int
------unsigned int
------signed int
long
------unsigned long
------signed long
浮点型:
float
double
构造类型:
----数组类型
----结构体类型struct
----枚举类型enum
----联合类型union
指针类型:
int* p;
char* pc;
float pf;
void pv;
空类型:
void表示空类型(无类型)
通常应用于函数的返回类型,函数的参数,指针类型。
这些就是C语言中的基本类型,在平时学习中也经常用到。
接下来介绍整形在内存中的存储:
一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。
那数据在所开辟的内存中到底是如何存储的呢?
计算机中有符号数有三种表示方法,即原码,反码,补码。
三种表示方法均有数值位和符号位两部分,符号位都是用0 表示正,用1表示负,而数值位三种方法表示均不相同。
我们先来看看什么是原码,反码,补码。
原码:直接将二进制按照正负数的形式翻译成二进制就可以了。
反码:将原码的符号位不变其他位依次取反。
补码:反码加1;
正数的原码,反码,补码都相同。
对于整形来说:数据存放内存中其实存放的是补码。
为什么呢?
在计算机系统中,数值一律用补码来表示和存储,原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以同一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
知道了存储方式那么存储的顺序是什么呢?
大小端的介绍:
大端模式:是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。
小端模式:是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中。
一般电脑是小端模式;手机属于大端模式。
/*设计一个小程序来判断当前机器的字节序*/
#include<stdio.h>
int check_sys()
{
int i=1;
return (*(char *)&i);
}
int main()
{
int ret=check_sys():
if(ret==1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
rturn 0;
}
看这个代码
#include<stdio.h>
int main()
{
char a=-1;
signed char b=-1;
unsighed char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
输出的是a=-1,b=-1,c=225.
a,b都是有符号的,b是无符号数,负数在内存中存储是存储它的补码,所以他们三个都应该先进行原,反,补操作,因为是字符类型,占2个字节八位,所以截断保留8个二进制数在因为打印的是%d进行类型的提升开始补位,符号位是什么就补什么位,a,b都是有符号的负数故还需进行减一求反操作打印出最后的结果,而c无符号数,补得符号位为0,且不用进行减一取反操作。
再来看这个:
int main()
{
char a[1000];
int i;
for(i=0;i<1000;i++)
{
a[i]=-1-i;
}
printf("%d",strlen(a));
return 0;
}
//这个输出的结果是255;char有符号类型范围为-1~-128;127~1,0,这个循环到0是停止,因为strlen遇到0,'\0',NULL停止,故循环255次。
cs