判断cpu是大小端

首先,需要明确什么是little endian 以及 big endian 模式? 
就是判断 计算机的字节储存顺序 是大端还是小端 左低位右高位
Little endian:按照从低地址到高地址存放数据的低字节和高字节。
Big endian:按照从低地址到高地址存放数据的高字节和低字节。

举个小例子:
    例如,假设从内存地址0x0000 开始有以下数据:
               0x12 0x34 0xab 0xcd
       如果我们去读取一个地址为0x0000 的四个字节变量,若字节序为big-endian,则读出结果为0x1234abcd;若字节序位little-endian,则读出结果为 0xcdab3412。如果我们将0x1234abcd 写入到以0x0000 开始的内存中,则Little endian 和Big endian 模式的存放结果如下:
地址               0x0000     0x0001     0x0002     0x0003
big-endian       0x12         0x34         0xab         0xcd
little-endian      0xcd         0xab         0x34         0x12

我们使用两种方法进行解决,这个判断问题:
第一种方法:通过指针强制类型转换并对整形数据的首字节进行赋值,判断该值付给了高值还是低值
代码如下:
判断cpu是大小端_第1张图片
程序不在做赘述,看解释就可以!

第二种方法:使用union联合体进行解决。
众所周知,union联合体中得所有数据成员共享同一段内存,所有我们可以运用int和char共同组成一个union,然后对int型进行赋值1,判断char型的是不是等于1,如果等于1,说明是little endian,因为低地址存放了1,高地址存放了0.如果不等于1(实际等于0),说明是Big endian,因为高地址存放了1,低地址存放了0。
程序如下:
       判断cpu是大小端_第2张图片
 写一个函数,判定运算环境(16位以上字长)是little-endian 还是 big-endian(12分)
/* 函数返回 0:little endian,非零:big endian */
int is_little_endian(void)
{
int  v = 1;
 
if(*((char *)&v) == 1)   return 0;
return 1;
}


#include
union A
{
char c;
int i;
};
int check()
{
A a;
a.i = 1;
return a.c;


}
int main()
{
if (check())
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}

方法2:

写一个函数判断计算机的字节存储顺序是升序(little-endian)还是降序(big-endian)。

答:需要记住的是,小端模式下低字节内存放低位数据,即,对于int类型的数据0x12345678,最低地址放的是0x78。这个可以作为编程的依据:

[cpp]  view plain  copy
 
  1. #include   
  2.   
  3. int main(void)  
  4. {  
  5.     unsigned int a = 0x12345678;  
  6.     if (*((unsigned char *)&a) == 0x78) {  
  7.         printf("little end\n");  
  8.     }  
  9.     else {  
  10.         printf("big end");  
  11.     }  
  12.     return 0;  
  13. }  
#include  
  
int main(void)  
{  
    int a = 0x12345678;  
   int  b = 12345678; 
    char* p=(char *)&a;//一个整形占4位 共4*8=32个字节 所以存储16位数字。
   char* q=(char *)&b;


printf("%x\n",p[0]);
    printf("%x\n",p[1]);
printf("%d\n",q[0]);
printf("%d\n",q[1]);
printf("%c\n",q[0]);
printf("%c\n",q[1]);
    return 0;  
}  
//output
78
56
78
97
N
a
Press any key to continue

http://blog.sina.com.cn/s/blog_788c13b00100u4w7.html 



你可能感兴趣的:(c/c++)