判断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 <wbr>是Little <wbr>endian <wbr>还是Big <wbr>endian <wbr>模式?
程序不在做赘述,看解释就可以!

第二种方法:使用union联合体进行解决。
众所周知,union联合体中得所有数据成员共享同一段内存,所有我们可以运用int和char共同组成一个union,然后对int型进行赋值1,判断char型的是不是等于1,如果等于1,说明是little endian,因为低地址存放了1,高地址存放了0.如果不等于1(实际等于0),说明是Big endian,因为高地址存放了1,低地址存放了0。
程序如下:
       编写一段程序判断系统中的CPU <wbr>是Little <wbr>endian <wbr>还是Big <wbr>endian <wbr>模式?
 写一个函数,判定运算环境(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<stdio.h>
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
 在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  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. }  

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



发布了206 篇原创文章 · 获赞 31 · 访问量 28万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览