【C语言】如何判断一个机器的大小端

如何判断一个机器的大小端

一:什么是机器的大小端

机器的大小端是指在内存中存储多字节数据时的字节顺序。在一个多字节数据(如整数、浮点数)被存储在内存中时,会按照一定的字节顺序将它们存储。主要有两种类型的大小端:

  1. 大端序:数据的高位字节存储在低地址位置低位字节存储在高地址位置
  2. 小端序:数据的低位字节存储在低地址位置高位字节存储在高地址位置

例子:

这两种大小端序的命名来自于《格列佛游记》(Gulliver'sTravels)中的一个故事:主人公吉列佛来到了两个相互战争的王国,其中一个王国的人们从蛋的大端开始吃,而另一个王国的人则从蛋的小端开始吃。这个故事被引用来描述字节顺序不同的机器。

不同的计算机体系结构(如x86、ARM)有不同的大小端表示方式,而在网络传输中,通常使用大端序(网络字节序)来保证数据的一致性。在实际编程中,需要注意数据在不同大小端机器上的转换和处理。

二:为什么会有大小端

为什么会有⼤⼩端模式之分呢?

  • 这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着⼀个字节,⼀个字节为8bit 位,但是在C语⾔中除了8 bitchar之外,还有16 bitshort 型,32 bit long型(要看具体的编译器)。
  • 另外,对于位数⼤于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度⼤于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。因此就导致了⼤端存储模式和⼩端存储模式。

例如:⼀个 16bitshortx ,在内存中的地址为 0x0010x 的值为 0x1122 ,那么0x11 为⾼字节, 0x22 为低字节。对于⼤端模式,就将 0x11 放在低地址中,即 0x0010 中,0x22 放在⾼地址中,即 0x0011 中。⼩端模式,刚好相反。我们常⽤的 X86 结构是⼩端模式,⽽KEIL C51 则为⼤端模式。很多的ARM,DSP都为⼩端模式。有些ARM处理器还可以由硬件来选择是

⼤端模式还是⼩端模式。

三:设计一个小程序来判断当前机器的大小端

方法一:指针类型强转

存储一个int类型变量赋值为1,把它的地址强转为char*类型。

因为1在内存中的存储为0x00000001

如果是小端存储,char类型中存储的应该为0x01

如果是大端存储,char类型中存储的应该为0x00

c 复制代码
#include <stdio.h>
int check_sys()
{
 	int i = 1;
 	return (*(char *)&i);
}
int main()
{
 	int ret = check_sys();
 	if(ret == 1)
 	{
 		printf("⼩端\n");
 	}
 	else
 	{
 		printf("⼤端\n");
 	}
 	return 0;
}

方法二:联合体

使用联合体可以判断大小端的原理是通过联合体的成员共享同一块内存空间。在这段代码中,union 定义了一个联合体 un,包含一个整型变量 i 和一个字符型变量 c

  1. 通过将un.i赋值为1,将1存储在联合体 un的整型变量i中。

  2. un.c 表示将联合体 un 的整型变量 i 强制转换为字符型变量 c,这样就可以访问联合体 un 内存中的字节。

  3. 在小端存储方式中,联合体 un 的字节从低地址到高地址分别是 1 00 00 00,其中的 1 是最低有效字节。

  4. 在大端存储方式中,联合体 un 的字节从低地址到高地址分别是 00 00 00 1,其中的 1 是最高有效字节。

c 复制代码
int check_sys()
{ 
	union
 	{
 		int i;
 		char c;
 	}un;
 	un.i = 1;
 	return un.c;
}

int main()
{
 	int ret = check_sys();
 	if(ret == 1)
 	{
 		printf("⼩端\n");
 	}
 	else
 	{
 		printf("⼤端\n");
 	}
 	return 0;
}

※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持

相关推荐
xu_wenming6 小时前
嵌入式软件架构中的6种解耦艺术
c语言·驱动开发·嵌入式硬件·架构
「QT(C++)开发工程师」7 小时前
C++ 11 常用for循环
开发语言·c++
我还记得那天8 小时前
0 初识C++
开发语言·c++
FfHUCisI8 小时前
Go 编译过程全景
开发语言·后端·golang
FfHUCisI8 小时前
Golang 语法分析与 AST:Parser 与 go/ast
开发语言·后端·golang
lemon_sjdk9 小时前
ObjectProperty
java·开发语言·算法
大模型码小白9 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
hh9509 小时前
Agent Plan x DeepSeek Harness:Agent 供应链安全与第三方插件审计
java·开发语言·安全·agent plan·adg成都社区·adg社区
「QT(C++)开发工程师」9 小时前
C++ std::move 详解
开发语言·c++