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

本文深入探讨了计算机中数据的存储方式,包括整型的补码表示、大小端字节序的区别,并通过实例代码展示了如何判断系统是大端还是小端存储。同时,文章详细解释了整型提升的概念,通过多个计算示例说明了在不同类型转换和运算中可能遇到的数据丢失和截断问题。
摘要由CSDN通过智能技术生成

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

先来看看整型的存储。

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

大小端

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

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

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

先来举个栗子吧

#include <stdio.h>

int main()
{
	int a = 0x11223344;

	return 0;
}

在这里插入图片描述

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

#include <stdio.h>

int main()
{
	int a = 0x00000001;

	char* p = (char*)&a;

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

	return 0;
}

我用char * 的指针访问int 类型的数据,这样就可以只看见a这个16进制数的一个字节,因为我们访问都是从低地址访问,所以如果是小端存储,*p就是1,反之,若是大端存储,*p就是0。
在这里插入图片描述

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

int main()
{

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

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

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

#include <stdio.h>

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

在这里插入图片描述
但是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 <string.h>
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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hyzhang_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值