jianhong_wu 发表于 2014-11-2 22:46:56

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

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

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

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

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


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

伟-肇庆:

你可以这样加一个强制类型转换,就是之前的逻辑了。



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

风雪--重庆:
Keil 4。

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

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


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


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

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



页: [1]
查看完整版本: 注意!自然数比如0xfe 编译器默认就是int型而不是char型,很容易在左移操作中出错。