在操作系統中,經常會用到判斷大小端,很多面試題中也會經常遇到,以前的時候沒有總結過,這里總結一下。
以后用到了就直接可以用了。
所謂的大小端,大致的解釋意思就是:
【大端模式】 CPU對操作數的存放方式是高地址存放低位,低地址存放高位。
【小端模式】CPU對操作數的存放方式是高地址存放高位,低地址存放低位。
大多數ARM處理器都是采用的小端模式,PowerPC是采用的大端模式,網絡字節序是采用的大端模式。
常用的有兩種方式來判斷大小端,一種是使用C語言中的聯合體,具體代碼如下:
1
2
3
4
5
6
7
8
9
10
|
int
checkCPU()
{
union w
{
int
a;
char
b;
}c;
c.a = 1;
return
(c.b == 1);
// 小端返回TRUE,大端返回FALSE
}
|
其中,linux內核中就是使用這部分的代碼,代碼如下所示:
1
2
|
static
union
{
char
c[4]; unsigned
long
mylong; } endian_test = {{
'l'
,
'?'
,
'?'
,
'b'
} };
#define ENDIANNESS ((char)endian_test.mylong)
|
另外一種就是使用指針的方式,具體代碼如下所示:
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
|
void
checkPoint(
void
)
{
int
i = 1;
unsigned
char
*pointer;
pointer = (unsigned
char
*)&i;
if
(*pointer)
{
printf
(
"litttle_endian"
);
}
else
{
printf
(
"big endian/n"
);
}
}
|