数据结构之小端和大端之谜
这些是什么?
小端和大端是存储多字节数据类型(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
时间复杂度: O(1)
辅助空间: O(1)
当上面的程序在小端机器上运行时,输出“67 45 23 01”,而如果它在大端机器上运行,则输出“01 23 45 67”。
有没有一种快速的方法来确定你的机器的字节顺序?
没有。确定机器字节顺序的方法。这是执行相同操作的一种快速方法。
#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;
}
// This code is contributed by rathbhupendra
小端
输出:
小端
时间复杂度: O(1)
辅助空间: O(1)
在上面的程序中,一个字符指针c指向一个整数i。由于当字符指针被取消引用时字符的大小为 1 个字节,它将仅包含整数的第一个字节。如果机器是小端,则 *c 将为 1(因为最后一个字节首先存储),如果机器是大端,则 *c 将为 0。字节
序对程序员重要吗?
大多数时候,编译器会处理字节顺序,但是,在以下情况下,字节顺序会成为一个问题。
它在网络编程中很重要:假设您将整数写入小端机器上的文件,然后将此文件传输到大端机器。除非有小端到大端的转换,否则大端机器会倒序读取文件。你可以在这里找到这样一个实际的例子。
网络的标准字节顺序是 big endian,也称为网络字节顺序。在网络上传输数据之前,首先将数据转换为网络字节顺序(大端)。
有时使用类型转换很重要,下面的程序就是一个例子。
#include <iostream>
using namespace std;
int main() {
unsigned char arr[2] = {0x01, 0x00};
unsigned short int x = *(unsigned short int *) arr;
cout << x << endl;
cin.get();
return 0;
}
在上面的程序中,一个char数组被类型转换为无符号短整数类型。当我在小端序机器上运行上面的程序时,我得到1作为输出,而如果我在大端序机器上运行,我得到256。为了使程序独立于字节顺序,应该避免使用上述编程风格。
什么是双端处理器?
双端处理器可以在小端和大端两种模式下运行。
小端机、大端机和双端机的例子是什么?
基于英特尔的处理器是小端。ARM处理器是小终端。当前的ARM处理器是双向的。
摩托罗拉68K proc