OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6054|回复: 5

关于51的移位运算问题(1<<16)

[复制链接]

20

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2013-3-21
在线时间
0 小时
发表于 2013-12-9 16:17:33 | 显示全部楼层 |阅读模式
#include<reg52.h>

//#define TL(x) ((1<<16) - x) % 256;
//#define TH(x) ((1<<16) - x) / 256;
#define uint unsigned int
int main( void )
{
  uint  a, b, c, d;

// a = (1 << 2);
// d = 9 % 2;
// b = (~0) - 1;
a = (65536 - 250) / 256;  //这里1
        a = ((1<<16) - 250) / 256; //还有这里2
// c= ((1<<16) - 250) % 256; //c输出正确。。。
return 0;
}
很郁闷为什么1输出结果正确而2输出结果是0啊。。。1<<16不是65536么,不是一样的么。。?
今天早上莫名其妙地因为这个问题困惑了好久,求解



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

170

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2013-8-9
在线时间
3 小时
发表于 2013-12-9 16:30:26 | 显示全部楼层
回复【楼主位】溪孟:
---------------------------------
应该是1<<16位超过了uint的位了,你这里是17位了吧。不行的
回复 支持 反对

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-12-9 16:31:27 | 显示全部楼层
可能编译器默认的是16位而你这样移位的话就溢出了 (long)1<<16这样试试
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-10 10:40:40 | 显示全部楼层
回复【楼主位】溪孟:
---------------------------------
1<<16不是65535吧,应该是10000啊,超出unsigned int的范围了,所以当做0来处理了

老规矩,强奸法(unsigned long)(1<<16)这样试下结果怎么样
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2014-1-6 10:24:39 | 显示全部楼层
把a定义为unsigned long int型的,试试看,应该就可以了
合肥-文盲
回复 支持 反对

使用道具 举报

6

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-4-4
在线时间
0 小时
发表于 2014-1-29 13:40:05 | 显示全部楼层
后面加个L试试
~~~~ 欢迎讨论,拒绝谩骂 ~~~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 23:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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