单片机C语言移位问题

[复制链接]
 楼主| 电信小菜 发表于 2013-9-2 14:58 | 显示全部楼层 |阅读模式
ulong NUM;(全局)
NUM=0x00000001<<16;执行完NUM=0x00000000;
ulong NUM=0x00000001;(全局)
NUM<<=16; 结果,执行到这步时(即还未执行),NUM不是初始值0x00000001
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
 楼主| 电信小菜 发表于 2013-9-2 16:07 | 显示全部楼层
ayb_ice 发表于 2013-9-2 15:37
NUM=1ul

ul是啥
ningling_21 发表于 2013-9-2 16:16 | 显示全部楼层
电信小菜 发表于 2013-9-2 16:06
呵呵,解决办法倒是知道,移位之前再赋值确实可以,就是好奇为什么赋初值了之后,值会自己变为0 ...

估计是在别处被改变了,LZ用什么编译器,我用KEIL 没有LZ说的现象...
 楼主| 电信小菜 发表于 2013-9-2 16:34 | 显示全部楼层
KEIL.想再试下然后截图的,结果现在是正常了,但我相信刚才不是我眼花...不知道是不是程序结构出问题导致编译有误?然后,前一半问题,在单片机C语言里能那样操作吗
 楼主| 电信小菜 发表于 2013-9-2 17:36 | 显示全部楼层
@ningling_21 @ayb_ice
再举个例子,在内存中定义一个2维数组,结果用到的时候,前两行的数据出错,后面24行的数据是对的,如果把数组放在ROM,就不会。

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

如果可以放在ROM那还好,如果只能放RAM时,一个全局变量如果在运行时被改那还了得(当然,我不知道是编译过程还是运行过程),有解吗
ningling_21 发表于 2013-9-2 17:46 | 显示全部楼层
电信小菜 发表于 2013-9-2 17:36
@ningling_21 @ayb_ice
再举个例子,在内存中定义一个2维数组,结果用到的时候,前两行的数据出错,后面24 ...

变量放在ROM中还能变吗?

全局变量,一般是多处使用的,如果被改动也很正常.
如果程序中没有改动,那就也许是被编译器优化了,可以加关键字修饰一下该变量...
飞鹰嵌入式 发表于 2013-9-2 17:50 | 显示全部楼层
常量貌似不能移位吧?:)
 楼主| 电信小菜 发表于 2013-9-2 17:56 | 显示全部楼层
飞鹰嵌入式 发表于 2013-9-2 17:50
常量貌似不能移位吧?

原本的程序是C++的,所以我才想是不是单片机C语言的常量不能移位,c++可以
飞鹰嵌入式 发表于 2013-9-2 17:59 | 显示全部楼层
单片机的常量存储在文字区,类似是rom好像是不能修改的,
 楼主| 电信小菜 发表于 2013-9-2 18:02 | 显示全部楼层
ningling_21 发表于 2013-9-2 17:46
变量放在ROM中还能变吗?

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

1.你没注意看吧..我说放ROM就不会变...
2.放RAM的情况,当然能保证其他地方没用到,比如那个2维数组,是固定的、不需要改的,如果其他地方写入,放ROM必然出错,而实际并没有出错。补充:加volatile也没用
 楼主| 电信小菜 发表于 2013-9-2 18:04 | 显示全部楼层
飞鹰嵌入式 发表于 2013-9-2 17:59
单片机的常量存储在文字区,类似是rom好像是不能修改的,

文字区是什么?除了RAM和ROM还有其他存储区?
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中,同上.
ayb_ice 发表于 2013-9-3 07:57 | 显示全部楼层
这些问题都是基本问题,也可以肯定是程序员自己问题
 楼主| 电信小菜 发表于 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
sunhq02 发表于 2013-9-3 08:48 | 显示全部楼层
这个常量需要指出是ulong类型
在末尾加 UL
0x00000001UL
不然编译器总是拿常量当int处理

评分

参与人数 2威望 +5 收起 理由
上官梦舞 + 3 确实加上UL就行了
电信小菜 + 2

查看全部评分

 楼主| 电信小菜 发表于 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也被清零了,这是为什么
luoyang188 发表于 2013-9-3 11:00 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

236

帖子

2

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