什么是大端、小端

118 阅读2分钟

前言

新手处女作,写的不好多多海涵,如发现错误烦请指正!欢迎沟通交流。

一、 什么是大端、小端

  1. 其实大端、小端指的是字节序。字节序简单来说就是大于一个字节的数据在内存中存放的顺序。

在32位的系统下,存放一个int型数据需要4个字节(32个bit位)

屏幕截图 2023-11-04 113855.png

  • 大端字节序:整数的高位字节存储在内存的低地址处。

    定义一个int型的整形x等于15

屏幕截图 2023-11-04 183331.png

屏幕截图 2023-11-04 184242.png

小端字节序:整数的高位字节存放在内存的高地址处。

屏幕截图 2023-11-04 190444.png

二、 如何判断大端和小端(c语言实现)

>方法一:指针法

  • 先在内存中存储一个整形的1,并用一个char类型的指针指向它,因为32位系统下char只占一个字节并指向内存中低地址处,如果是小端存储模式,整型1的有效位01(16进制)会存储在内存的低地址处,正好为char指针所指位置。
  • 反之如果是大端存储模式,整型1的有效位会存储在内存的高地址处,char指针则会指在0处。 以下为代码实现:
#include<stdio.h>

int main()
{
	//32位系统下
//0000 0000 0000 0000 0000 0000 0000 0001
	int a = 1;
	//利用char类型指针进行判断
	char* test = (char*) & a;
	if (*test == 1)
	{
		printf("小端");
	}
	if (*test == 0)
	{
		printf("大端");
	}


	return 0;
}

屏幕截图 2023-11-04 201640.png

>方法二:联合体

  • 定义一个联合体,里面定义一个整型b和一个char类型a,因为联合体的特性,a、b共用一块内存空间,接下来初始化a为1,使得整型b的低位值也相应变化,后面判断方式和方法一类似不再赘述。
  • 以下为代码实现:
#include<stdio.h>

union U
{
	char a;
	int b;
}u;

int main()
{
	//初始化联合体
	u.a = 1;
	if (u.a == 1)
	{
		printf("小端");
	}
	if (u.a == 0)
	{
		printf("大端");
	}
	return 0;
}

屏幕截图 2023-11-04 201416.png