查看CPU的大小端模式

大小端: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。所以就可以判断该当前环境的工作的大小端模式了。呵呵。





你可能感兴趣的:(工作,网络,测试,语言,平台,X86)