找回密码
 注册
搜索
查看: 954|回复: 3

[讨论] 强制转换和大小端问题

[复制链接]
发表于 2007-3-8 16:34:13 | 显示全部楼层 |阅读模式
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1。

unsigned short a = 1;
unsigned char* b = (unsigned char*)(&a);
return (*b == 1)? 0: 1;
谁能解释unsigned char* b = (unsigned char*)(&a);为什么这样做?为什么要用指针类型,这样unsigned char b = (unsigned char)(a);不行吗?为什么大端*b==1
发表于 2007-3-11 20:48:39 | 显示全部楼层
其实任何强制类型转换就数值来讲都是逻辑上的,和endianism无关。
unsigned char b = (unsigned char)(a);
unsigned char* b = (unsigned char*)(&a);
这两条赋值语句本身都和endianism无关。
这里关键是要得到a的数据存放的起始地址,
通过按字节查看其数据存储来得知endianism。
如果a的起始地址存放的是a的低字节的数据,
那么endianism就是little endian。
至于这里的“大端*b==1”,是错误的。[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2007-3-11 21:35:45 | 显示全部楼层
2楼分析正确。
unsigned short a=1;其共占ram 2个字节,如果是Big_endian,低字节放0,高字节放1;如果是Little_endian,低字节放1,高字节放0;所以通过低字节是1或是0来区别大小端!这里大端应该是*b==0。另外一种实现方法是:

union   {   
unsigned short       s;   
unsigned char         c[sizeof(unsigned short)];   
}   un;   
   
un.s   =   0x01;   
return (un.c[0] == 0)? 0: 1;
点评回复

使用道具 举报

 楼主| 发表于 2007-3-12 15:36:28 | 显示全部楼层
多谢
我觉得三楼的是正确的做法
我的是错的
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-15 10:35 , Processed in 0.043591 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表