独闷闷网

 找回密码
 立即注册
搜索
查看: 1861|回复: 0
收起左侧

[原创] 注意!自然数比如0xfe 编译器默认就是int型而不是char型,很容易在左移操作中出错。

[复制链接]
发表于 2014-11-2 22:46:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 jianhong_wu 于 2014-11-2 22:49 编辑

风雪--重庆:
(0xFF >>2) << 1和(0xFF<<2) >> 1运算结果不一样!

伟-肇庆:
左移低位补零,右移高位补零.你动手验证一下吧.

风雪--重庆:
按照我的猜想,移动后的结果两个都应该是0111 1110。但是实际编译结果不是。(0xFF<<2) >> 1结果就是0xFE!
keil4.jpg

伟-肇庆:
有这事??编译器把整数默认的自然数为整形数。编译器默认的整数是int 类型,小数是double。 所以你这样(0xFF >>2) << 1,不存在溢出。

伟-肇庆:
unsigned char.png
你可以这样加一个强制类型转换,就是之前的逻辑了。



鸿哥--深圳:
@风雪--重庆 这个是VC平台吗?

风雪--重庆:
Keil 4。

鸿哥--深圳:
这个结果确实让我有点惊讶!也就是这个适用于单片机了。

伟-肇庆:
更准确的说,还不是数据转换问题,是编译器默认数据类型的问题。0xfe 编译器默认就是int型。
0xFF >>2) << 1这一步不存在任何数据类型转化。


鸿哥--深圳:
只是他默认把0xff为int类型。明白了。


伟-肇庆:
结果之所以那样,只是编译器默认正数是int型,就像1.0是double 型。
数数是int型,就像1.0是double 型

鸿哥--深圳:
明白。这个解释很科学。
伟-肇庆:
鸿哥说的隐形转化,如 char c=0xff;int  i=c+1;就存在隐形转化。更形象应该这样说如 unsigned char c='a';int  i=c+1;就存在隐形转化。



乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2021-7-31 11:03 , Processed in 0.152511 second(s), 21 queries .

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