判断系统CPU是大端还是小端

来源:互联网 发布:网络攻击分析论文 编辑:程序博客网 时间:2024/04/29 13:56

     所谓的大端小端就是CPU在存储数据的时候是从高地址开始存储还是低地址开始存储。例如在sizeof(int) = 2的系统中,1 + 2 << 8= 1 + 512 = 513,我们把这个值赋值给int nTemp = 1 + (2 << 8)。我们假定系统分配给变量nTemp的地址空间为:0x0000FF080x0000FF09,那么0x0000FF08开始的8个位为第一个字节的存储空间,0x0000FF09开始的8个位为第二个字节的存储空间。

如果CPU为大端,内存中的存储分配则为:

0x0000FF0800000010(二进制) -> 2 (十进制)

0x0000FF0900000001(二进制) -> 1 (十进制)

如果CPU为小端,内存中的存储分配则为:

0x0000FF0800000001(二进制) -> 1 (十进制)

0x0000FF0900000010(二进制) -> 2 (十进制)

那么如何判断系统CPU是大端还是小端呢???

我们可以利用C中的的共用体unionchar类型,共用体的数据成员是共享存储空间的,而char类型在任何系统中都是一个字节。

我们可以定义一个共用体

union

{

char element[sizeof(int)];

int sum;

};

然后对共用体的sum进行赋值,只要判断element各个元素的值就可以知道系统CPU为大端,还是小端。因为共同体是共享存储的,我们这里假定测试系统sizeof(int)2,那么element[0]的内容为sum存储空间中的第一个字节的内容,element[1]的内容为sum存储空间的第二个字节的内容。如果CPU为小端则表达式(int)(element[0]) + ((int)elememt[1] << 8)的值将等于sum。如果CPU的大端则表达式(int)(element[1]) + ((int)elememt[0] << 8)的值将等于sum

下面给出可移植的代码来判断系统的CPU是大端还是小端。

[cpp] view plaincopyprint?
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. union BigOrSmall  
  5. {  
  6.     char element[sizeof(int)];  
  7.     int sum;  
  8. };  
  9.   
  10. bool checkBigOrSmall()  
  11. {  
  12.     int i;  
  13.       
  14.     int j;  
  15.       
  16.     char strTemp[9];  
  17.       
  18.     int nLen = sizeof(int);  
  19.       
  20.     BigOrSmall bigOrSmall;  
  21.       
  22.     bigOrSmall.sum = 0;  
  23.       
  24.       
  25.     for (i = 0; i < nLen; ++i)  
  26.     {  
  27.         bigOrSmall.sum += (i + 1) << (8 * (i));   
  28.     }  
  29.       
  30.     int sum = 0;  
  31.       
  32.     for (i = 0; i < nLen; ++i)  
  33.     {  
  34.         sum += bigOrSmall.element[i] << (8 * (i));  
  35.     }  
  36.       
  37.     for (i = 0; i < nLen; ++i)  
  38.     {  
  39.         printf("the %d byte address:0x%08x ",i + 1, &bigOrSmall.element[i]);  
  40.           
  41.         ///从低到高取出bigOrSmall.element[i]的每一位  
  42.         for (j = 0; j < 8; ++j)  
  43.         {  
  44.             if (1 & (bigOrSmall.element[i] >> j))  
  45.             {  
  46.                 strTemp[7 - j] = '1';  
  47.             }  
  48.             else  
  49.             {  
  50.                 strTemp[7 - j] = '0';  
  51.             }  
  52.         }  
  53.         strTemp[8] = 0;  
  54.           
  55.         printf("%s(bin) -> %d(dec)\n", strTemp, bigOrSmall.element[i]);  
  56.     }  
  57.       
  58.     if (sum == bigOrSmall.sum)  
  59.     {  
  60.         return false;           ///小端  
  61.     }  
  62.     else  
  63.     {  
  64.         return true;            ///大端  
  65.     }  
  66. }  
  67.   
  68.   
  69. int main()  
  70. {  
  71.     if (checkBigOrSmall())  
  72.     {  
  73.         printf("The type of cpu is big\n");  
  74.     }  
  75.     else  
  76.     {  
  77.         printf("The type of cpu is small\n");  
  78.     }  
  79.   
  80.     return 0;  
  81. }  


最后给出在不同系统上上述代码的运行结果:、


在我自己机子上运行结果:

HP服务器上的运行结果:


原创粉丝点击