C语言之数据的存储(一)(整型数据)

时间:2021-04-21 00:51:15

一、整型数据在内存中的存储

1.1整型数据家族

char,short,int long(每种类型又分为unsigned 和signed,例如,signed char,unsigned char)

1.2整型数据的存储

对于整型数据,其在计算机内存当中,存储的是整型数据的补码

但是对于不同类型的电脑,其补码的存储方式也是不同的,按照存储方式的不同,可以分为大端存储模式和小端存储模式

大端存储模式是指数据的低位存储在内存中的高地址中,而数据的高位存储在内存中的低地址中

而小端存储模式是指数据的低位存储在内存中的低地址中,而数据的高位存储在内存中的高地址中

对于某个数据,例如int a=0x00000001,这是1的补码,0x表示它是16进制,在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,也就是8个比特位,a是4个字节的数据,每个字节的数据都会存放在一个地址单元中,对于a,从右到左,字节依次提高,例如0x01是它的低字节,0x00是高字节,所以对于大端模式来说,a在内存中的存储形式是:00 00 00 01

二、整型数据的存储范围

对于unsigned类型的数据,其存储范围是0 ~ ( 2^n - 1 ),而signed类型的数据,其存储范围是- (2^(n-1)) ~ + (2^(n-1) - 1),

例如unsignd char 类型数据的存储范围为0~255,signed char类型数据的存储范围为-128~127

三、例题分析

unsigned char i = 0;
int main()
{
for(i = 0;i<=255;i++)
{
printf("hello world\n");
}
return 0;
}
很显然,unsigned char的类型数据,存储范围为0~255,所以i的范围始终在这之内
,那么当i等于255的循环执行完成后,i++后会是多少呢,答案是0,这是一个死循环

那么该如何理解呢,对于unsigned char 类型,0的补码为00000000,不断+1,一直
到255,补码为11111111,此时255再加1,其补码变为100000000,char类型只能保存
后8个比特位的数据,即00000000,也就是0


int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));return 0;
}
a[i]的取值范围为-128~127,在循环中,a[i]从-1一直到-128,-128再次-1是多少呢
-128的补码为11111111 11111111 11111111 10000000,被赋给char类型的a[i],
只能存储末尾八个比特位,即10000000,-1后的补码为,011111111,显然是127的补码
从127再次--,直到遇到0,strlen函数停止,所以答案为128+127=255

四、查询整型家族存储数据范围

储存在一个叫 limits.h 的文件当中,可以用一个叫做Everything的软件直接搜索limits.h,将其中一个拖动到我们的vs项目中去,在这里我们可以找到我们需要的存储范围

C语言之数据的存储(一)(整型数据)

C语言之数据的存储(一)(整型数据)