关于2个字节合并成一个字的问题

[复制链接]
4092|8
 楼主| 淡定的牙粉 发表于 2015-9-9 21:48 | 显示全部楼层 |阅读模式
请教各位大神,我看网上不少程序将2个字节合并成一个字是这样写的
unsigned int x;
unsigned char h,l;
x=h<<8+l;
可我觉得应该这样才对
unsigned int x;
unsigned char h,l;
x=(unsigned int)h<<8+(unsigned int)l;大家怎么看
ccxlslr 发表于 2015-9-9 22:51 | 显示全部楼层
不是差不多吗?
C标准,哪个标准忘了。 小于int的,处理时要进行整型提升,这是标准。所以上面那样写是没有问题的。当然如果是你做编译器,不遵守也没有办法。就像运算符的优先级一样,是标准。
ayb_ice 发表于 2015-9-10 06:18 来自手机 | 显示全部楼层
上面那个是有隐患的,整形提升C89是没有的
NE5532 发表于 2015-9-10 08:53 | 显示全部楼层
第一个方法,要求编译器隐含强制类型转换,向高精度靠拢了。
第二个方法是很可靠的,楼主的习惯很好,值得表扬。
另外我遇到这种问题,多采用共用体来处理。
ningling_21 发表于 2015-9-10 09:45 | 显示全部楼层
如果用上面的写法,如果编译器不是隐式类型转换就只能算错
北京再见2013 发表于 2015-9-11 14:30 | 显示全部楼层
union unit_16 //声明一个2 个字节型的联合体
{
unsigned int x;
struct Byte16 //为了不让2个 char 变量也公用同一地址,需要一个结构体
{
unsigned char high;
unsigned char low;
}Bytes;
};

这样写可好?
lianer2002 发表于 2015-9-11 17:01 | 显示全部楼层
北京再见2013 发表于 2015-9-11 14:30
union unit_16 //声明一个2 个字节型的联合体
{
unsigned int x;

这样写最好了,不过貌似要注意大小端的问题
wuhenyouyu 发表于 2015-9-14 08:22 来自手机 | 显示全部楼层
ccxlslr 发表于 2015-9-9 22:51
不是差不多吗?
C标准,哪个标准忘了。 小于int的,处理时要进行整型提升,这是标准。所以上面那样写是没有 ...

C是有规定的,但是部分编译器默认是不遵守的,需要手动配置下!比如PIC的编译器,mcc18
ccxlslr 发表于 2015-9-14 10:00 | 显示全部楼层
wuhenyouyu 发表于 2015-9-14 08:22
C是有规定的,但是部分编译器默认是不遵守的,需要手动配置下!比如PIC的编译器,mcc18 ...

的确有些编译器为了简化代码不支持,但很多都有设置,像Keil C51某个版本,在编译选项里面就专门有个整型提升选项。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

34

帖子

0

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