查看CPU的大小端模式

来源:互联网 发布:酒店智能门锁 网络 编辑:程序博客网 时间:2024/06/07 07:27
大小端: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。所以就可以判断该当前环境的工作的大小端模式了。呵呵。





原创粉丝点击