大端字节顺序和小端字节顺序有啥区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大端字节顺序和小端字节顺序有啥区别相关的知识,希望对你有一定的参考价值。
什么是大/小端呢?所谓大端就是指高位值在内存中放低位地址,所谓小端是指低位值在内存中放低位地址。比如0x11223344在大端机上是11223344,在小端机上是44332211,而一个机器是大端还是小端要看cpu类型以及运行在上面的操作系统。同一款cpu在不同的操作系统使用的大小端情况是不同的。当然我们通常使用的x86+windows是小端。那如何测试大小端呢?
通常的技巧是使用一个指针:如:
[cpp]
view
plaincopy
int
x
=
1;
if(*(char
*)&x
==
1)
printf("little-endian\n");
else
printf("big-endian\n");
或者使用union的特性。union是一个联合体,所有变量公用一块内存,只是在不同的时候解释不同。其在内存中存储是按最长的那个变量所需要的位数来开辟内存的。如:
[cpp]
view
plaincopy
#include
using
namespace
std;
union
int
number;
char
s;
uniontest;
bool
isbigendin()
uniontest.number
=
0x01000002;
return
(uniontest.s
==
0x01);
void
main()
if
(isbigendin())
cout<<"big-endian"<
评论
0
0
加载更多 参考技术A 数据的存储方式不一样,大端是高位低字节,低位高字节,小端是低位低字节,高位高字节。建议你了解一下汇编
大端 小端和网络字节序说明
不同CPU存放数据有大端(Big-Endian)和小端(little-Endian)之分
小端字节序和大端字节序表示存储的字节顺序有区别
小端字节序:低字节存于内存低地址;高字节存于内存高地址;
long型数据0x12345678
在小端系统中,
地址 | 数据 |
---|---|
0x00000100 | 0x78 |
0x00000101 | 0x56 |
0x00000102 | 0x34 |
0x00000103 | 0x12 |
内存的地址是由低到高的顺序;而数据的字节也是由低到高的
大端字节序:高字节存于内存低地址;低字节存于内存高地址;
long型数据0x12345678
在大端系统中,
地址 | 数据 |
---|---|
0x00000100 | 0x12 |
0x00000101 | 0x34 |
0x00000102 | 0x56 |
0x00000103 | 0x78 |
内存的地址是由低到高的顺序;而数据的字节却是由高到低的
网络字节序
网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题;
UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的;
所以说,网络字节序是大端字节序;比如,我们经过网络发送整型数值0x12345678时,在80X86平台中,它是以小端发存放的,在发送之前需要使用系统提供的字节序转换函数htonl()将其转换成大端法存放的数值;
常见CPU的字节序
Big Endian : PowerPC、IBM、Sun
Little Endian : x86、DEC
ARM既可以工作在大端模式,也可以工作在小端模式。
以上是关于大端字节顺序和小端字节顺序有啥区别的主要内容,如果未能解决你的问题,请参考以下文章