C程序员经常被问及的一道面试题是:什么是大端/小端,怎么样判断是大端/小端?大端小端问题对于嵌入式程序员绝对不会陌生(否则,别告诉我你是搞嵌入式的),它与CPU体系结构有关。比如常见的X86处理器是小端模式;ARM处理器默认是小端模式,当然也可以通过配置,改为大端模式;Moto的68000、DEC的SPARC是大端模式。
1.什么是大小端?
定义:一个内存对象由多个字节组成;同时,内存存放字节数据由低地址到高地址方向增长;
那么,待存放的内存对象的低地址字节先存放,即:内存对象的低地址字节存放在内存 的低地址,就是小端模式。反之,内存对象的高地址字节存放在内存的低地址,就是大 端模式。
概念乍看很简单,但是不真正理解的话,很快就会遗忘,容易混淆。看图:
以int a=0x01020304 的存储为例。
2.判断是大端还是小端。
判断方法很多,这里给出一个简单又常用的方法。——利用C语言里的联合体union;
联合体中的域值是共用内存的。故,一个联合体的大小以其中包含最多字节的域的大小为大小。
如:
typedef union{
int i;//sizeof(int)==4
char c;//sizeof(char)==1
}utest;//sizeof(utest)==4
utest u;
u.i=1; // 1的十六进制表示为0x00000001
c程序如下:
1: #include <cstdio>
2: #include <cstdlib>
3:
4: typedef union {
5: int i;
6: char c;
7: }utest;
8:
9: int main(int argc,char *argv[])
10: {
11: utest u;
12: u.i=1;
13: printf("输出为1是小端,输出为0是大端!输出为[ %d ]\n",u.c);
14: return 0;
15: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }