打印

两个byte 转word疑问

[复制链接]
6571|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
doob|  楼主 | 2009-10-2 11:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
chen3bing| | 2009-10-2 15:57 | 只看该作者
感觉Buffer[2]应该是UINT16型的。

使用特权

评论回复
板凳
acmilann| | 2009-10-2 17:10 | 只看该作者
告诉你个简单的方法:
union Word_define
{
     UINT8   Buffer[2];
     UINT16 TempNum;
};

注意大小端问题

使用特权

评论回复
地板
void_c| | 2009-10-2 18:03 | 只看该作者
本帖最后由 void_c 于 2009-10-2 18:07 编辑

Buffer[0]<<8 ,8位数据左移8位不就出去了吗?

楼主自己没理解好C语言。
根据C语言标准,<<运算要求操作数至少是int,
如果不满int,自动转换成int(C语言整型提升)。

Buffer[0]<<8,
实际运算,并不是8位数左移8位,而是int型左移8位。

使用特权

评论回复
5
doob|  楼主 | 2009-10-3 08:09 | 只看该作者
惭愧,我也发觉自己的知识不扎实;
LS,上面那种处理没错吧,我仿真一下数据是没错的;

使用特权

评论回复
6
gooogleman| | 2009-10-3 08:10 | 只看该作者
没有问题。经常这样用。

使用特权

评论回复
7
e掾木| | 2009-10-3 08:17 | 只看该作者
union是最好的选项,特别是将一个struct数据保存到eeprom里头,不费一枪一**。

使用特权

评论回复
8
dtmcp| | 2009-10-3 08:49 | 只看该作者
TempNum=*(UINT16 *)(Buffer)

使用特权

评论回复
9
yxwsz| | 2009-10-3 12:22 | 只看该作者
TempNum=*(UINT16 *)(Buffer)
dtmcp 发表于 2009-10-3 08:49


这个代码在big endian模式下是错误的;
如果在RISC处理器上,还可能会出现 "非对齐“异常。

使用特权

评论回复
10
lzh7735| | 2009-10-9 16:51 | 只看该作者
同意9楼,我接手过一项目,开始用8位单片机,原来的程序用的也是 TempNum=*(UINT16 *)(Buffer) 这种方法,后来换成16位单片机,程序员差点就跳楼了。

使用特权

评论回复
11
想出国打工| | 2009-10-10 10:20 | 只看该作者
我觉得lz方法不严谨;呵呵,这样好点吧!
UINT8   Buffer[2];
UINT16 TempNum;

TempNum=Buffer[0];
TempNum<<=8;
TempNum|=Buffer[1];

大家说呢?虽然繁琐但合理啊!hehe,对吧?要严谨!

使用特权

评论回复
12
arm_fan168| | 2009-10-10 11:43 | 只看该作者
楼主的写法在某些编译器上会出现错误的结果,Buffer[0]<<8在某些编译器上无论如何都是0

使用特权

评论回复
13
smartbird| | 2009-10-10 13:16 | 只看该作者
3楼的方法不是很好吗?为何不采用?

使用特权

评论回复
14
bhsdlmj| | 2009-10-15 16:28 | 只看该作者
同意9楼,我接手过一项目,开始用8位单片机,原来的程序用的也是 TempNum=*(UINT16 *)(Buffer) 这种方法,后来换成16位单片机,程序员差点就跳楼了。
lzh7735 发表于 2009-10-9 16:51


难道这种方法真是有问题么? 我可不同意9楼。

这样能有问题么??
TempNum = (((UINT16)Buffer[0]) << 8) |  ((UINT16)Buffer[1]) ;

管你什么编译器 能有问题么?

使用特权

评论回复
15
xwj| | 2009-10-15 16:45 | 只看该作者
唉...

不管用任何方法,都得区分大小端,很多CPU还得注意“非对齐”问题

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
bhsdlmj + 1
16
bhsdlmj| | 2009-10-15 16:46 | 只看该作者
唉...

不管用任何方法,都得区分大小端,很多CPU还得注意“非对齐”问题
xwj 发表于 2009-10-15 16:45

;P

使用特权

评论回复
17
computer00| | 2009-10-15 17:21 | 只看该作者
考虑到以后的可移植性,我一般这样写:

TempNum = Buffer[0];
TempNum*=256;
TempNum+=Buffer[1];

使用特权

评论回复
评分
参与人数 2威望 +3 收起 理由
古道热肠 + 2
bhsdlmj + 1
18
bhsdlmj| | 2009-10-16 11:48 | 只看该作者
考虑到以后的可移植性,我一般这样写:

TempNum = Buffer[0];
TempNum*=256;
TempNum+=Buffer[1];
computer00 发表于 2009-10-15 17:21


恩这话 你以前说过!!!好方法!

不过似乎大部分人不这样写!!!

使用特权

评论回复
19
huangqi412| | 2009-10-16 12:31 | 只看该作者
这样移有时候编译器很傻.   
圈圈这样一般也会编译出多余指令.
俺一直是指针+大小端条件编译,直接可移植的.  最精简. 修改下大小端定义为0或1就好.

使用特权

评论回复
20
huangqi412| | 2009-10-16 12:35 | 只看该作者
破单片机不快,有时候还真是想要C语言又想要效率,多余点点指令都要扣...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

165

主题

1113

帖子

3

粉丝