打印

单片机C语言移位问题

[复制链接]
3407|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电信小菜|  楼主 | 2013-9-2 14:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ningling_21| | 2013-9-2 15:07 | 只看该作者
NUM = (0x00000001);
        NUM = NUM <<16;

移位之前再赋值就可以了...

使用特权

评论回复
板凳
ayb_ice| | 2013-9-2 15:37 | 只看该作者
NUM=1ul<<16

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
电信小菜 + 2
地板
电信小菜|  楼主 | 2013-9-2 16:06 | 只看该作者
ningling_21 发表于 2013-9-2 15:07
NUM = (0x00000001);
        NUM = NUM

呵呵,解决办法倒是知道,移位之前再赋值确实可以,就是好奇为什么赋初值了之后,值会自己变为0

使用特权

评论回复
5
电信小菜|  楼主 | 2013-9-2 16:07 | 只看该作者
ayb_ice 发表于 2013-9-2 15:37
NUM=1ul

ul是啥

使用特权

评论回复
6
ningling_21| | 2013-9-2 16:16 | 只看该作者
电信小菜 发表于 2013-9-2 16:06
呵呵,解决办法倒是知道,移位之前再赋值确实可以,就是好奇为什么赋初值了之后,值会自己变为0 ...

估计是在别处被改变了,LZ用什么编译器,我用KEIL 没有LZ说的现象...

使用特权

评论回复
7
电信小菜|  楼主 | 2013-9-2 16:34 | 只看该作者
KEIL.想再试下然后截图的,结果现在是正常了,但我相信刚才不是我眼花...不知道是不是程序结构出问题导致编译有误?然后,前一半问题,在单片机C语言里能那样操作吗

使用特权

评论回复
8
电信小菜|  楼主 | 2013-9-2 17:36 | 只看该作者
@ningling_21 @ayb_ice
再举个例子,在内存中定义一个2维数组,结果用到的时候,前两行的数据出错,后面24行的数据是对的,如果把数组放在ROM,就不会。

1楼的问题跟这个应该是类似的吧,放在内存中的数据,不知道是编译时还是运行过程中,内存的数据被改动了吧,总之,问题是不是可以概括成:放在内存的全局变量,在编译或者运行过程数据被改动了?

如果可以放在ROM那还好,如果只能放RAM时,一个全局变量如果在运行时被改那还了得(当然,我不知道是编译过程还是运行过程),有解吗

使用特权

评论回复
9
ningling_21| | 2013-9-2 17:46 | 只看该作者
电信小菜 发表于 2013-9-2 17:36
@ningling_21 @ayb_ice
再举个例子,在内存中定义一个2维数组,结果用到的时候,前两行的数据出错,后面24 ...

变量放在ROM中还能变吗?

全局变量,一般是多处使用的,如果被改动也很正常.
如果程序中没有改动,那就也许是被编译器优化了,可以加关键字修饰一下该变量...

使用特权

评论回复
10
飞鹰嵌入式| | 2013-9-2 17:50 | 只看该作者
常量貌似不能移位吧?:)

使用特权

评论回复
11
电信小菜|  楼主 | 2013-9-2 17:56 | 只看该作者
飞鹰嵌入式 发表于 2013-9-2 17:50
常量貌似不能移位吧?

原本的程序是C++的,所以我才想是不是单片机C语言的常量不能移位,c++可以

使用特权

评论回复
12
飞鹰嵌入式| | 2013-9-2 17:59 | 只看该作者
单片机的常量存储在文字区,类似是rom好像是不能修改的,

使用特权

评论回复
13
电信小菜|  楼主 | 2013-9-2 18:02 | 只看该作者
ningling_21 发表于 2013-9-2 17:46
变量放在ROM中还能变吗?

全局变量,一般是多处使用的,如果被改动也很正常.

1.你没注意看吧..我说放ROM就不会变...
2.放RAM的情况,当然能保证其他地方没用到,比如那个2维数组,是固定的、不需要改的,如果其他地方写入,放ROM必然出错,而实际并没有出错。补充:加volatile也没用

使用特权

评论回复
14
电信小菜|  楼主 | 2013-9-2 18:04 | 只看该作者
飞鹰嵌入式 发表于 2013-9-2 17:59
单片机的常量存储在文字区,类似是rom好像是不能修改的,

文字区是什么?除了RAM和ROM还有其他存储区?

使用特权

评论回复
15
sedatefire| | 2013-9-3 00:25 | 只看该作者
问题
1. ulong NUM;   请问ulong是怎么typedef的,51中,int,u-int,都是16位的.
2. 51中,ulong xdata NUM = xxx, 编译器是不会理会的.
3. M3中,如果变量分配在FSMC中,同上.

使用特权

评论回复
16
ayb_ice| | 2013-9-3 07:57 | 只看该作者
这些问题都是基本问题,也可以肯定是程序员自己问题

使用特权

评论回复
17
电信小菜|  楼主 | 2013-9-3 08:27 | 只看该作者
sedatefire 发表于 2013-9-3 00:25
问题
1. ulong NUM;   请问ulong是怎么typedef的,51中,int,u-int,都是16位的.
2. 51中,ulong xdata NUM = x ...

#define ulong unsigned long

使用特权

评论回复
18
sunhq02| | 2013-9-3 08:48 | 只看该作者
这个常量需要指出是ulong类型
在末尾加 UL
0x00000001UL
不然编译器总是拿常量当int处理

使用特权

评论回复
评分
参与人数 2威望 +5 收起 理由
上官梦舞 + 3 确实加上UL就行了
电信小菜 + 2
19
电信小菜|  楼主 | 2013-9-3 09:43 | 只看该作者
是这样的:
ulong NUM32_1=0x00000001;
uchar check[];
for(i=0;i<BCH_LENGTH_CODEWORD;i++)
{
        *(check+i)=0;
}
在对check清零的过程中,NUM32_1也被清零了,这是为什么

使用特权

评论回复
20
luoyang188| | 2013-9-3 11:00 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

236

帖子

2

粉丝