📜  大恩蒂恩之谜

📅  最后修改于: 2021-05-19 19:42:14             🧑  作者: Mango

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

    大,小字节序机器中整数ox01234567的内存表示形式

如何查看计算机上多字节数据类型的内存表示形式?
这是一个示例C代码,它显示int,float和指针的字节表示形式。

#include 
  
/* 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”作为输出。

有没有一种快速的方法来确定计算机的字节序?
没有。确定计算机字节序的方法。这是执行此操作的一种快速方法。

C++
#include 
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


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


输出:

Little endian

在上面的程序中,字符指针c指向整数i。因为字符的大小为1个字节时,字符指针解引用它仅包含整数的第一个字节。如果机器为小端,则* c将为1(因为最后一个字节先存储),而如果机器为大端,则* c将为0。

字节序对程序员重要吗?

大多数情况下,编译器会处理字节序,但是,在以下情况下,字节序成为一个问题。

在网络编程中很重要:假设您在小字节序的机器上向文件写入整数,然后将此文件传输到大字节序的机器上。除非有很少的字节序到字节序转换,否则字节序大的机器将以相反的顺序读取文件。您可以在这里找到这样一个实际的例子。

网络的标准字节顺序为big endian,也称为网络字节顺序。在网络上传输数据之前,先将数据转换为网络字节顺序(大字节序)。

有时在使用类型转换时很重要,下面的程序是一个示例。

#include 
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。为使程序的字节序独立,应避免使用上述编程风格。

什么是双端?

双端处理器可以在小端和大端两种模式下运行。

小型,大端和双端机器的例子是什么?
基于Intel的处理器很少使用字节序。 ARM处理器很少使用字节序。当前一代的ARM处理器是双向的。

摩托罗拉68K处理器是高端厂商。 PowerPC(摩托罗拉公司生产)和SPARK(Sun公司生产的)处理器的市场占有率很高。这些处理器的当前版本是双向的。

字节顺序会影响文件格式吗?

以1字节为基本单位的文件格式独立于字节序,例如ASCII文件。其他文件格式使用一些固定的字节序格式,例如JPEG文件以大字节序格式存储。


哪个更好-小字节序还是大字节序?

小端大端一词来自乔纳森·斯威夫特(Jonathan Swift)的《格列佛游记》(Gulliver’s Travels)。两组不能同意应将鸡蛋打开的一端是大还是小。就像鸡蛋问题一样,没有技术上的理由选择一个字节排序约定而不是另一个字节排序约定,因此,争论逐渐演变成对社会政治问题的争吵。只要选择并遵守了其中一项约定,该选择就是任意的。