您的位置:首页 > 理论基础 > 计算机网络

查看CPU的大小端模式

2012-05-17 20:12 225 查看
大小端:CPU对内存单元数据的排列顺序的方式.

    采用小端(Little-endian)模式的CPU对操作数的存放方式是从低字节到高字节(从右到左即从低到高);这是X86平台采用的模式;

    采用大端(Big-endian)模式对操作数的存放方式是从高字节到低字节;在网络上传送的数据采用的方式;

例如:

16bits宽的数:0x1234在Little-endian模式的CPU中内存的存放方式为:

0x4000 0x34

0x4001 0x12

而在Big-endian中则为:

0x4000 0x12
0x4000 0x34

测试你当前环境的CPU的工作方式(即查看大小端)

#include <stdio.h>
#include <stdlib.h>

union word
{
int a;
char b;
}c;

int checkCPU(void)
{
c.a = 1;
return (c.b == 1);
}

int main(void)
{
int i = checkCPU();
if ( i==0 )
{
fprintf(stdout, "this is Big_endian\n");
}
else if ( i==1 )
{
fprintf(stdout, "this is Little_endian\n");
}
return 0;
}


为什么可以这样子检测出来呢?这是利用C语言的共同体的特性:所有成员都是从低地址开始存放的。

让我们来分析以上的代码:(假设是在X86,并假设是在低端模式的,然后证明它,即数学上的反证法啦。呵呵)平台下32bits下存放的:

a, b在内存中的排列:

地址                          数据(a)    数据(b)     

000000001             0x01             0x??

000000002             0x00

000000003             0x00

000000004             0x00

 

我们在checkCPU中将int a赋值为1.为什么可根据return (c.b == 1)的判定结果来判断大小端呢?注意到,我们没有为c.b赋值,所以它的值会是之前(即a)的数据存放的值。注意到,共同体的特性是:所有成员都是从低地址开始存放的。所以如果是在低端模式下:c.b的值应该是0x01。在高端模式下,c.b的值应该是0x00。所以就可以判断该当前环境的工作的大小端模式了。呵呵。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息