字节序的大小端存储问题剖析

目录

什么是大小端存储

一:大小端的介绍:

二:判断当前的编译器环境的大小端存储

方法1:使用指针

方法2:利用联合体的特性来判断大小端的存储:


什么是大小端存储

首先我们先来熟悉一下其他的一些关于内存的知识,如果你对自己有足够的自信,请点击目录直接跳到下面的正文。


一:大小端的介绍:

我们知道,一个int类型的数据是4个字节,当数据为1的时候,其二进制码为00000000000000000000000000000001

那么这四个字节的内容在内存中的顺序是什么样的呢?

函数二进制位为1的那个字节是放在低地址出还是放在高地址处呢?

这就是大小端存储的问题:

大端存储就是低进制位的字节放在高地址处,高进制位的字节放在低地址处,如果是按照大端存储的话那么含有1的那个字节就会放在最右边的那个格子;



 

小端存储就是低进制位的字节放在低地址处,高进制位的字节放在高地址处,那么这样的话就是含有1的那个字节就会放在最左边的那个格子上。


 


存储的方式是按照大端还是小端的方式这个c语言标准是没有规定的,由不同的编译器来具体实现,下面就是两种判断大小端存储的方法(在vs2019环境下)。

二:判断当前的编译器环境的大小端存储

方法1:使用指针

我们都知道指针是存放地址的,如果定义一个整型指针指向一个整型变量的话,那么他存放的地址值就是其四个字节中的最低的地址值,然后步长就是接下来的4个字节。



那么,如果我们用字符型指针来指向一个整型变量的话,那么我们就可以只访问到其最低地址的一个字节。


 

当我们定义整型变量的值为1的时候,如果是大端存储,那么对指针进行解引用的话,得到的结果应该是0,如果是小端存储的时候,对其解引用的话得到的结果应该是1.

下面就让我们用代码来实现一下:


#include<stdio.h>
int main()
{
	int a = 1;
	char* p = (char*)&a;
	if (*p == 1)
		printf("当前是小端存储\n");
	else printf("当前是大端存储\n");
}

在vs2019中跑出来的结果是小端存储,与预期结果是符合的,你们也可以试一试用不同的编译器来跑一跑这段代码。

方法2:利用联合体的特性来判断大小端的存储:

联合体的知识引论:首先我们知道联合体是可以将多个变量放到同一块区域的,如果联合体定义的是下面的情况:

union test
{
    char a;
    int b;
};

那么他们在内存中的情况应该是这样的:

那自然,我们还是可以把b定义成1,然后对a进行访问,得到存储的大小端结果:


#include<stdio.h>
union test
{
	char a;
	int b;
};
int main()
{
	union test biancheng;
	biancheng.b = 1;
	if (biancheng.a == 1)
		printf("当前环境是小端存储\n");
	else printf("当前环境是打断存储\n");
}

很显然,这次在vs2019上的运行结果还是小端存储。


以上就是本期的全部内容,如果你觉得这篇文章对你有所启发的话,请多多点赞收藏加转发,你们的支持就是我前进的动力(一个赞一道题)!!!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值