大端法和小端法

引言

在计算机内存中,通常是以字节(Byte),也就是 8 个位(Bit)为基本存储单元(也有以 16 位为基本存储单元的)。对于跨越多个字节的数据类型(比如 int 长 4 个字节),如何在内存中对这些字节进行排序有两种常见的方法:大端法(Big-endian)和小端法(Little-endian)

【注】首先不管是大端法还是小端法存储,计算机在内存中存放数据的顺序都是从低地址到高地址,所不同的是首先取低字节的数据存放在低地址还是取高字节数据存放在低地址。

基本概念

高位放在低地址就是大端法

低位放在低地址就是小端法

例如0x0A0B0C0D的在大端和小端中的存放方式分别为:

程序验证

清单一:利用C里的联合类型

 1 #include<stdio.h>
 2
 3 union MyUnion
 4 {
 5     int a;
 6     char c;
 7 };
 8
 9 int main()
10 {
11     MyUnion mu;
12     mu.a = 0x0001;
13     if (mu.c == 1)   printf("small endian\n");
14     else  printf("big endian\n");
15
16
17     return 0;
18 }

清单二:利用指针

 1 #include<stdio.h>
 2
 3 typedef unsigned char *byte_pointer;
 4
 5 void show_bytes(byte_pointer start, size_t len)
 6 {
 7     size_t i;
 8     for (int i = 0; i < len; i++)
 9         printf(" %.2x", start[i]);
10     printf("\n");
11 }
12
13 void show_int(int x)
14 {
15     show_bytes((byte_pointer)&x, sizeof(int));
16 }
17
18 void show_float(float x)
19 {
20     show_bytes((byte_pointer)&x, sizeof(float));
21 }
22 void show_pointer(void *x)
23 {
24     show_bytes((byte_pointer)&x, sizeof(void *));
25 }
26
27 void test_show_bytes(int val)
28 {
29     int ival = val;
30     float fval = (float)ival;
31     int *pval = &ival;
32     show_int(ival);
33     show_float(fval);
34     show_pointer(pval);
35 }
36
37 int main()
38 {
39     int num = 0x1926;
40     test_show_bytes(num);
41
42     return 0;
43 }

结语

大多数Inter兼容机只用小端法,Android和IOS也只用小端法;IBM和Oracle的大多数机器用大端法,但它们的制造的个人电脑使用的是Inter兼容的处理器,因此使用小端法。

令人吃惊的是,对于哪种字节顺序更合适这个问题,人们表现的非常情绪化,从它的名字来源就可看出

【“端”的起源】

术语“little endian(小端)”和“big endian(大端)”出自Jonathan Swift的《格列佛游记》一书,其中两个派别交战的原因仅仅因为一方认为要从较大的一端敲开鸡蛋,而另一方认为要从小的一端敲开鸡蛋。

在作者的那个年代,Swift是借此讽刺英国和法国之间的持续冲突(难道命名者也是借此讽刺大端法和小端法的矛盾,,,只是臆想,蒟蒻什么也没说)

参考资料:

1、https://blog.csdn.net/zuyi532/article/details/8020712

2、https://blog.csdn.net/zuyi532/article/details/8020712

3、https://blog.csdn.net/u012861978/article/details/51906546

原文地址:https://www.cnblogs.com/lfri/p/10166406.html

时间: 2024-08-28 16:34:00

大端法和小端法的相关文章

关于SimpleMsgPack中swap引发的问题大端法和小端法研究笔记

今天diocp裙中[珠海]-芒果反应了一个关于SimpleMsgPack的问题 msgPack.AsFloat = 2.507182; 经过编码再解码后,会直接触发异常. 因为msgPack的标准,在打包的数据是大端法IEEE 754 下面是msgPack的标准说明 Float format family stores a floating point number in 5 bytes or 9 bytes. float 32 stores a floating point number in

大端法、小端法、网络字节序 转

一般来说,大部分用户的操作系统(如windows, FreeBsd,Linux)是Little Endian 的.少部分,如MAC OS ,是Big Endian 的. 所谓MSB (Most Significant Byte)就是,一个数字中,最重要的那位, 比如,12004,中文读作,一万两千零四,那最高位的1,就表示了一万,此处就称作MSB,最有意义的位. 而LSB (Least Significant Byte)与MSB相反,个位数4就可以称为LSB, 在草稿纸上演算的时候,我们习惯左边

关于字节序(大端法、小端法)的定义

<UNXI网络编程>定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址.小端存在起始地址,即是小端字节序:大端存在起始地址,即是大端字节序. 也可以说: 1.小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端. 2.大端法(Big-Endian)就是高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端. 举个简单的例子,对于整形0x12345678.它在大端法和小端法的系统内中

网络通信之 字节序转换原理与网络字节序、大端和小端模式

原文地址:http://www.cnblogs.com/fuchongjundream/p/3914770.html 一.在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节.小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低

网络通信时字节序转换原理与网络字节序、大端和小端模式

引言:在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节.小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低字节),接收方网络协议函数接收时会将接收到的第一个字节存放到低地址(想要接收高字节,真正接收的是低字节),所以最后双

网络通信之字节序转换原理与网络字节序、大端和小端模式

一.在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节.小 端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低字节),接收方网络 协议函数接收时会将接收到的第一个字节存放到低地址(想要接收高字节,真正接收的是低字节),所以最后

大端小端法

不管是大端法还是小端法存储,计算机在内存中存放数据的顺序都是从低地址到高地址,所不同的是首先取低字节的数据存放在低地址还是取高字节数据存放在低地址. 若首先取高字节的数据存放在低地址,则是大端法 若首先去低字节的数据存放在低地址,则是小端法 即是,高字节(大)在低地址叫大端法,低字节(小)在低地址叫小端法 参考:http://blog.csdn.net/zuyi532/article/details/8020712

大端法、小端法、网络字节序

关于字节序(大端法.小端法)的定义 <UNXI网络编程>定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址.小端存在起始地址,即是小端字节序:大端存在起始地址,即是大端字节序.

js arrayBuffer 字节序问题,小端法,大端法

原文博客 { var buffer = new ArrayBuffer(2) var bytes = new Uint16Array(buffer) bytes[0] = (65 << 8) + 66 var blob = new Blob([buffer], { type: 'text/plain' }) var dataUri = window.URL.createObjectURL(blob) open(dataUri) // BA 受系统的字节序影响,小端法 } { let buffe