1. 主页
  2. 文档
  3. C语言教程
  4. C语言其他
  5. C语言小端和大端之谜

C语言小端和大端之谜

这些是什么? 
小端和大端是存储多字节数据类型(int、float 等)的两种方式。在小端机器中,多字节数据类型的二进制表示的最后一个字节首先存储。另一方面,在大端机器中,首先存储多字节数据类型的二进制表示的第一个字节。 
假设整数被存储为 4 个字节(对于那些使用基于 DOS 的编译器,例如 C++ 3.0,整数是 2 个字节),那么一个值为 0x01234567 的变量 x 将被存储如下。

如何在您的机器上查看多字节数据类型的内存表示? 
这是一个示例 C 代码,显示了 int、float 和指针的字节表示。 

#include <stdio.h>

/* function to show bytes in memory, from location start to start+n*/
void show_mem_rep(char *start, int n) 
{
int i;
for (i = 0; i < n; i++)
printf(" %.2x", start[i]);
printf("\n");
}

/*Main function to call above function for 0x01234567*/
int main()
{
int i = 0x01234567;
show_mem_rep((char *)&i, sizeof(i));
getchar();
return 0;
}

上面的程序在小端机器上运行时,输出“67 45 23 01”,而在大端机器上运行时,输出“01 23 45 67”。
有没有一种快速的方法来确定你的机器的字节顺序? 
有 n 没有。确定机器字节序的方法。这是一种快速的方法。 


#include <bits/stdc++.h>
using namespace std;
int main() 
{ 
unsigned int i = 1; 
char *c = (char*)&i; 
if (*c) 
cout<<"Little endian"; 
else
cout<<"Big endian"; 
return 0; 
} 

#include <stdio.h>
int main() 
{
unsigned int i = 1;
char *c = (char*)&i;
if (*c) 
printf("Little endian");
else
printf("Big endian");
getchar();
return 0;
}

输出: 

Little endian

时间复杂度: O(1)

辅助空间: O(1)

在上面的程序中,一个字符指针 c 指向一个整数 i。由于取消引用字符指针时字符大小为 1 个字节,因此它将仅包含整数的第一个字节。如果机器是小端,那么 *c 将为 1(因为首先存储最后一个字节),如果机器是大端,那么 *c 将为 0。 
字节序对程序员来说重要吗?
大多数时候编译器会处理字节顺序,但是,字节顺序在以下情况下会成为一个问题。
它在网络编程中很重要:假设您将整数写入小端机器上的文件,然后将此文件传输到大端机器。除非有小端到大端的转换,否则大端机器会以相反的顺序读取文件。你可以在这里找到这样一个实际的例子。
网络的标准字节序是大端序,也称为网络字节序。在网络上传输数据之前,首先将数据转换为网络字节顺序(大端)。 
有时在使用类型转换时很重要,下面的程序就是一个例子。

#include <stdio.h>
int main()
{
unsigned char arr[2] = {0x01, 0x00};
unsigned short int x = *(unsigned short int *) arr;
printf("%d", x);
getchar();
return 0;
}

在上面的程序中,一个 char 数组被强制转换为一个无符号短整数类型。当我在小端机器上运行上述程序时,我得到 1 作为输出,而如果我在大端机器上运行它,我得到 256。为了使程序独立于字节序,应避免使用上述编程风格。 
什么是双端序? 
双端处理器可以在小端和大端两种模式下运行。
小端、大端和双端机器的例子是什么? 
基于英特尔的处理器是小端序。ARM 处理器是小端序。当前一代 ARM 处理器是双端的。
摩托罗拉 68K 处理器是大端。PowerPC(摩托罗拉)和 SPARK(Sun)处理器是大端的。这些处理器的当前版本是双端的。 
字节序会影响文件格式吗? 
以 1 个字节为基本单位的文件格式与字节顺序无关,例如 ASCII 文件。其他文件格式使用一些固定的字节序格式,例如,JPEG 文件以大字节序格式存储。 
哪个更好——小端还是大端? 
小端和大端的术语来自乔纳森斯威夫特的格列佛游记。两组不能就应该打开鸡蛋的一端达成一致意见 – 一个 – 小或大。就像鸡蛋问题一样,没有技术理由选择一个字节的排序约定而不是另一个,因此争论退化为关于社会政治问题的争吵。只要选择并始终遵守其中一项约定,选择就是任意的。

这篇文章对您有用吗?