为什么会有大端/小端之分?(众说纷纭)

为什么会有大端/小端之分?(众说纷纭)

起源:

端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。在计算机业Big Endian和Little Endian也几乎引起一场战争。在计算机业界,Endian表示数据在存储器中的存放顺序。下文举例说明在计算机中大小端模式的区别。

有人说:

计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的,所以,计算机的内部处理都是小端字节序。但是,人类还是习惯读写大端字节序,所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。

有人说:

存储的单元是字节,网络传输的单元也是字节。大小端是针对字节流中某个字节内存储顺序而制造的一个概念。 比如: 在内存中存储是酱紫的:0x01 0x02 0x03 0x04(X86是4字节),从高字节开始存放(大端)。 然后它向网络发送数据是从左到右发结果字节流就变成了0x04 0x03 0x02 0x01 (0x01是最先发送出去的,看起来网络字节流就变成了小端,小字节在前) 然后接收端接收到的字节流是:然后收到网络数据的顺序就变成了0x01 0x02 0x03 0x04(重新变成了大端)。

有人说

在计算机系统中,规定:每个地址单元都会对应一个字节(8个bit),但是,在c语言中,除了有一个字节(8个bit)的char,也有两个字节(16个bit)的short,也有四个字节(32个bit)的long(在不同的编译器下可能不同)。对于16位或者32位的处理器,即就是大于8位的处理器,由于寄存器的宽度大于一个字节,那么就存在如何将一个多字节的变量的数据如何存放的问题——所以,就有了大小端之分。

有人说:

x86是小端 ARM是大端(自由选择)

还有人说:

就算先有小端,也无法阻止别人开发大端。因为幸亏一条线只有两个端,所以只有大小端。 生命会充满它能找到的所有空间。这是生物的本能。 大小端和CPU有关系,CISC(复杂指令集)CPU一般使用小端数据格式,RISC一般使用大端数据格式 因为有人看着方便和机器识别方便的不同~~~ 存在即合理

4、字节序转换函数

1、htons 把unsigned short类型从主机序转换到网络序(host to network short) 2、htonl 把unsigned long类型从主机序转换到网络序(host to network long) 3、ntohs 把unsigned short类型从网络序转换到主机序(network to host short) 4、ntohl 把unsigned long类型从网络序转换到主机序(network to host long)

检测方法一

#include

int check()

{

union UN

{

char c;

int i;

}un;

un.i = 1;

return un.c;

}

int main(void)

{

if(check()==1)

printf("小端模式存储!\n");

else

printf("大端模式存储!\n");

return 0;

}

检测方法二

#include

int check()

{

int i = 1;

i = *(char*)&i;//取 i 的地址 强制类型转换后解引用

return i;

}

int main(void)

{

if(check()==1)

printf("小端模式存储!\n");

else

printf("大端模式存储!\n");

return 0;

}

检测方法三

#include

int check()

{

union UN

{

char a [4];

int i ;

} un ;

un .i = 1;

//02 是整数不够2位就补上0 x是以16进制输出 hhx 表示只输出两位

printf ("%02hhx %02hhx %02hhx %02hhx\n", un .a [0], un. a [1],un . a[2], un .a [3]);

return un . a[0];

}

int main(void)

{

if(check()==1)

printf("小端模式存储!\n");

else

printf("大端模式存储!\n");

return 0;

}

手撕实现小端转大端函数

UINT32 LE2BE(UINT8 *dat,UINT8 len)

{

UINT32 temp=0,fact=1;

UINT8 i=0;

for(i=0;i

{

temp+=dat[i]*fact;

fact*=256;

}

return temp;

}

相关推荐

问道炼丹大会攻略?(问道 炼丹)
365bet是什么公司

问道炼丹大会攻略?(问道 炼丹)

⌛ 06-29 👁️ 7371
国足世预赛第三阶段赛程:6月27日抽签,
365bet是什么公司

国足世预赛第三阶段赛程:6月27日抽签,

⌛ 06-28 👁️ 9937