首页 > 试题广场 >

请写一个C函数,若处理器是Big_endian的,则返回0;

[问答题]
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
int Check(){
    int a = 0x12345678;
     if(*((char*)&a) == 0x12){
         return 0;   
     }
     else{
        return 1;
    }
}

发表于 2016-01-18 22:55:00 回复(1)
解释代码: union 联合体是共用内存区域,也就是说int 和 char一起公用4byte.并且union一定是从低地址开始存放,所以char b对应最低内存区域。如果是大端存储,int的1存在最高位,其他全为0,小端存储时1存在最低位,所以只要判断b是否为0即可
发表于 2017-04-10 21:29:28 回复(2)
【解答】
int checkCPU() 
{ 
 { 
 union w 
 {  
 int a; 
 char b; 
 } c; 
 c.a = 1; 
 return (c.b == 1); 
 } 
} 
【剖析】
嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为: 

内存地址

存放内容

0x4000

0x34

0x4001

0x12

而在Big-endian模式CPU内存中的存放方式则为: 

内存地址

存放内容

0x4000

0x12

0x4001

0x34

32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为: 

内存地址

存放内容

0x4000

0x78

0x4001

0x56

0x4002

0x34

0x4003

0x12

而在Big-endian模式CPU内存中的存放方式则为: 

内存地址

存放内容

0x4000

0x12

0x4001

0x34

0x4002

0x56

0x4003

0x78

联合体union的存放顺序是所有成员都从低地址开始存放,面试者的解答利用该特性,轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。如果谁能当场给出这个解答,那简直就是一个天才的程序员。 

编辑于 2015-10-29 09:53:54 回复(7)
小端---低尾端---尾部放在低地址处 大端---高尾端---尾部放在高地址处
发表于 2016-07-07 16:05:42 回复(0)

int Check(){

    int a = 1;

    return  (*((char*)&a) == 1);

}

发表于 2016-07-17 17:44:24 回复(2)
//小端-》低地址存放低数据   pc
//大端-》低地址存放高数据   手机  网络

bool IsLittle_endian()
{
union A
{
int a;
char b;
}A;  //0000 0001
A.a=1;  //0000 0001
return A.b == 1; 

}
//如果是小端,返回1,如果是大端,返回0 
//大端存放:0000 0001
//小端存放:0100 0000
	//联合体。a,b占用同一块内存。

发表于 2017-07-03 14:32:55 回复(1)
联合体的数据成员从低字节开始对齐
发表于 2017-11-04 21:36:42 回复(0)
完全不懂。。。
发表于 2017-03-05 19:02:20 回复(0)
对于大小端判断个人的看法,不喜勿碰

首先 是对存放内容的 高低位数据的区分  例如:0x12345678     大概就是 0x78  是地位数据  再往上 就是0x56  ....     最大的是0x12        当然机器不同  区分也不同

所谓的小端存储  就是  地址低位的地方 存储  小端数据   例如先存储  上面说到的0x78

大端存储  就是 地址 高位的地方  存储  大端数据   例如上面提到的  0x12

发表于 2021-11-29 17:18:02 回复(0)
不要用 union 的方式,这是 ub
发表于 2021-05-16 00:18:32 回复(0)
大小头编码方式
发表于 2020-06-02 14:16:04 回复(0)
int a = 1,用char指针查看a地址的值。
发表于 2020-02-18 18:45:07 回复(0)

枚举类型的读取总是从低地址开始获取值(小端存储)

编辑于 2019-12-27 09:07:26 回复(0)
求解释啊,为什么我觉得答案好像是判断union是否为低位存储??
发表于 2018-04-16 10:37:01 回复(1)
联合体的特性,从低地址开始存放
发表于 2017-10-11 15:54:31 回复(0)
return htonl(1)==1?0:1;
发表于 2017-09-23 18:24:35 回复(0)
bool IsbigEndian(void)
{
    unsigned short int us=0x1234;
    unsigned char * pc=(unsigned char*)&us;
if(*pc==0x12)
return false;
else
return ture;

}
发表于 2017-09-02 10:34:07 回复(0)
  1. #include <stdio.h>  
  2.   
  3. typedef union{  
  4.     unsigned short value;  
  5.     unsigned char bytes[2];  
  6. }Test;  
  7.   
  8. int main(void)  
  9. {  
  10.     Test test_value;  
  11.     test_value.value = 0x1234;  
  12.   
  13.     if(test_value.bytes[0] == 0x12 && test_value.bytes[1] == 0x34)  
  14.         printf("big ending");  
  15.     else if(test_value.bytes[0] == 0x34 && test_value.bytes[1] == 0x12)  
  16.         printf("little ending");  
  17.     else  
  18.         printf("use test_value error");  
  19.     return 0;  
  20. }  
发表于 2017-08-23 15:40:33 回复(0)
小端---低尾端---尾部放在低地址处 大端---高尾端---尾部放在高地址处
发表于 2017-06-14 11:48:36 回复(0)
给出的答案 union的  
正确答案是不是  如果  返回 false  那么是大端  如果返回true  那么是小端
发表于 2017-03-02 19:11:35 回复(0)