吾爱程序员:这里有好玩的游戏和软件
当前位置:首页C语言教程 → C语言小端和大端之谜

C语言小端和大端之谜

来源:网络 | 更新时间:2022-02-02 09:49:19
这些是什么?  小端和大端是存储多字节数据类型(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 文件以大字节序格式存储。  哪个更好——小端还是大端?  小端和大端的术语来自乔纳森斯威夫特的格列佛游记。两组不能就应该打开鸡蛋的一端达成一致意见 - 一个 - 小或大。就像鸡蛋问题一样,没有技术理由选择一个字节的排序约定而不是另一个,因此争论退化为关于社会政治问题的争吵。只要选择并始终遵守其中一项约定,选择就是任意的。

最新文章

热点资讯

手游排行榜

CopyRight 2020-2030吾爱程序员

鄂ICP备2021004581号-8

本站资源收集于网络,如有侵权请联系我们:35492删除0109@qq.com