我们知道在计算机中数据是以二进制来存储的。最常见的计量存储单位大小的是字节。那么什么是字节序呢?
字节序,又称端序,尾序(英语:Endianness)。在计算机科学领域中,字节序是指存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。Endianness有时候也可以用指位序(bit)。
一般而言,字节序指示了一个UCS-2字符的哪个字节存储在低地址。如果LSByte在MSByte的前面,即LSB为低地址,则该字节序是小端序;反之则是大端序。在网络编程中,字节序是一个必须被考虑的因素,因为不同的处理器体系可能采用不同的字节序。在多平台的代码编程中,字节序可能会导致难以察觉的bug。
由上面的描述我们知道字节序是很重要的,那么怎么检测你机器上使用的是大端序还是小端序呢?
我们先看看大、小端序的详细定义。
示例中,最高有效位(MSB, Most Significant Byte)是0x0A 存储在最低的内存地址处。下一个字节0x0B存在后面的地址处。正类似于十六进制字节从左到右的阅读顺序。
小端序:
![Little-Endian.svg](http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Little-Endian.svg/280px-Little-Endian.svg.png)
最低有效位(LSB,Least Significant Byte)是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。
下面我写了一个简单的C程序来判断你机器是使用大端序还是小端序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#include <stdio.h>
#define BIG 0x02
#define SMALL 0x01
int main()
{
union testData{
char c;
int i;
};
testData test;
//输出变量test、i、c的地址 看看是不是一样的
printf(
"test:%x\ni:%x\nc:%x\n"
,&test,&test.i,&test.c);
//将高字节为0x02 低字节为0x01的数字存入test的i中
test.i = 0x0201;
if
(SMALL & test.c)
printf(
"机器采用小端序\n"
);
else
if
(BIG & test.c)
printf(
"机器采用大端序\n"
);
else
printf(
"天知道机器是什么字节序\n"
);
return
0;
}
|
代码定义了一个union变量,里面包含了一个1字节的char变量c,一个2字节的int变量i。整个结构体的大小的2个字节。通过将 0×0201赋值给test的int部分i,然后检查它的低地址即char部分的c(为什么?看看union变量)。如果c中保存的是0×02则代表机器 使用大端序,如果保存的是0×01则代表机器使用小端序。
参考资料:http://zh.wikipedia.org/zh/%E5%AD%97%E8%8A%82%E5%BA%8F#.E5.A4.A7.E7.AB.AF.E5.BA.8F
(全文完)
更多新手学习C语言的博文请关注:http://dabentu.com/1188.html
转载于:https://blog.51cto.com/dabentu/1175806