两个byte 转word疑问

[复制链接]
 楼主| doob 发表于 2009-10-2 11:55 | 显示全部楼层 |阅读模式
UINT8   Buffer[2];
UINT16 TempNum;

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

上面有错吗?

突然看不明白了,Buffer[0]<<8 ,8位数据左移8位不就出去了吗?
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位。
 楼主| doob 发表于 2009-10-3 08:09 | 显示全部楼层
惭愧,我也发觉自己的知识不扎实;
LS,上面那种处理没错吧,我仿真一下数据是没错的;
gooogleman 发表于 2009-10-3 08:10 | 显示全部楼层
没有问题。经常这样用。
e掾木 发表于 2009-10-3 08:17 | 显示全部楼层
union是最好的选项,特别是将一个struct数据保存到eeprom里头,不费一枪一**。
dtmcp 发表于 2009-10-3 08:49 | 显示全部楼层
TempNum=*(UINT16 *)(Buffer)
yxwsz 发表于 2009-10-3 12:22 | 显示全部楼层
TempNum=*(UINT16 *)(Buffer)
dtmcp 发表于 2009-10-3 08:49


这个代码在big endian模式下是错误的;
如果在RISC处理器上,还可能会出现 "非对齐“异常。
lzh7735 发表于 2009-10-9 16:51 | 显示全部楼层
同意9楼,我接手过一项目,开始用8位单片机,原来的程序用的也是 TempNum=*(UINT16 *)(Buffer) 这种方法,后来换成16位单片机,程序员差点就跳楼了。
想出国打工 发表于 2009-10-10 10:20 | 显示全部楼层
我觉得lz方法不严谨;呵呵,这样好点吧!
UINT8   Buffer[2];
UINT16 TempNum;

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

大家说呢?虽然繁琐但合理啊!hehe,对吧?要严谨!
arm_fan168 发表于 2009-10-10 11:43 | 显示全部楼层
楼主的写法在某些编译器上会出现错误的结果,Buffer[0]<<8在某些编译器上无论如何都是0
smartbird 发表于 2009-10-10 13:16 | 显示全部楼层
3楼的方法不是很好吗?为何不采用?
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]) ;

管你什么编译器 能有问题么?
xwj 发表于 2009-10-15 16:45 | 显示全部楼层
唉...

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

评分

参与人数 1威望 +1 收起 理由
bhsdlmj + 1

查看全部评分

bhsdlmj 发表于 2009-10-15 16:46 | 显示全部楼层
唉...

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

;P
computer00 发表于 2009-10-15 17:21 | 显示全部楼层
考虑到以后的可移植性,我一般这样写:

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

评分

参与人数 2威望 +3 收起 理由
古道热肠 + 2
bhsdlmj + 1

查看全部评分

bhsdlmj 发表于 2009-10-16 11:48 | 显示全部楼层
考虑到以后的可移植性,我一般这样写:

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


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

不过似乎大部分人不这样写!!!
huangqi412 发表于 2009-10-16 12:31 | 显示全部楼层
这样移有时候编译器很傻.   
圈圈这样一般也会编译出多余指令.
俺一直是指针+大小端条件编译,直接可移植的.  最精简. 修改下大小端定义为0或1就好.
huangqi412 发表于 2009-10-16 12:35 | 显示全部楼层
破单片机不快,有时候还真是想要C语言又想要效率,多余点点指令都要扣...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

165

主题

1113

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部