数据的存储(计算机存储的两种模式)(大端和小端)

在电脑中存在许多的数据,整型,浮点型,还有结构类型。

先来看看整型的存储。

正负数在内存中都是以补码的方式存储,正数的原码,反码和补码都是相同的,而负数是的原码取反+1才能得到反码,

大小端

在内存中数据存储的方式有两种,一种是大端字节序储存,一种是小端字节序储存。

什么是大端和小端呢?其实很简单

大端存储:把一个数的低字节内容存放到高地址处,高字节内容放到低地址处。
小端存储:把一个数的高字节内容存放到低地址处,低字节内容放到高地址处。

先来举个栗子吧

#include 

int main()
{
	int a = 0x11223344;

	return 0;
}

数据的存储(计算机存储的两种模式)(大端和小端)_第1张图片

如果要证明我们的电脑是什么储存方式就可以如下:

#include 

int main()
{
	int a = 0x00000001;

	char* p = (char*)&a;

	printf("%d\n", *p);

	return 0;
}

我用char * 的指针访问int 类型的数据,这样就可以只看见a这个16进制数的一个字节,因为我们访问都是从低地址访问,所以如果是小端存储,*p就是1,反之,若是大端存储,*p就是0。
数据的存储(计算机存储的两种模式)(大端和小端)_第2张图片

int check_sys()
{
	int a = 0x11000000;
	return  *(char*)&a;
}

int main()
{

	if (check_sys() == 0)
	{
		printf("小端\n");
	}
	else 
	{
		printf("大端\n");
	}
	return 0;
}

由图可知,显然电脑是小端存储的。

然后在存储模式的基础上我来讲讲整形提升的概念,直接肝题目比较直接

#include 

int main()
{
	unsigned char a = 200;
	unsigned char b = 100;
	unsigned char c = 0;
	c = a + b;
	printf("%d %d", a + b, c);
	return 0;
}

由题可知,a = 200,200是一个整型变量,但是被逼无奈a又是一个unsigned char型的变量,所以当200存放到a中的时候会发生数据丢失,二进制数字会被强行截断,200本来在内存中是00000000000000000000000011001000但是在a中就变成了11001000,同理b本来是00000000000000000000000001100100,但是在b中变成了01100100,此时a + b = 100101100

数据的存储(计算机存储的两种模式)(大端和小端)_第3张图片
但是c只能存放8个比特位所以最前面的1就被丢失了,所以a+b=300但是c= a+b =44

下面接要几道题目来理解整型的存储方式

int main()
{
 	//-1的补码
 	//1111111111111111111111111111111
 	//char类型折断
 	//11111111
 	//当char类型的数据要转换%d,int类型是要整型提升,有符号的数据+1,无符号的数据+0
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	//unsiged int 因为无符号,所以整型提升前面全+0
	//00000000000000000000000011111111
	printf("%d %d %d\n", a, b, c);

	return 0;
}
int main()
{
	char a = -128;
	//10000000000000000000000010000000
	//11111111111111111111111110000000
	//整型提升
	//11111111111111111111111110000000
	printf("%u\n", a);
	return 0;
}
int main()
{
	char a = 128;
	//00000000000000000000000010000000
	//11111111111111111111111101111111
	//11111111111111111111111110000000
	//10000000
	//整型提升
	//11111111111111111111111110000000
	printf("%u\n", a);
	return 0;
}
int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);//死循环打印
	}
	return 0;
}
#include 
int main()
{
	char a[1000];
	int i = 0;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d\n", strlen(a));

	return 0;
}

你可能感兴趣的:(C学习心得)