判断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 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值