单片机C语句问题

[复制链接]
2084|15
 楼主| 晓文88 发表于 2014-11-21 22:53 | 显示全部楼层 |阅读模式
单片机是MSP430F149
代码如下:

void NF_WriteAdder3(unsigned int block,unsigned int page)
{
    unsigned long blockPage;   //页地址

    blockPage = (block << 14) + (page << 9);     //实际地址
  
   。。。。

请教,和以下写法结果相同吗?

     unsigned long  lTemp;

      lTemp = block;
      lTemp <<= 14;
      blockPage =  lTemp;   
      lTemp = page;
      lTemp  <<= 9;
      blockPage + =  lTemp;   
恳请指教。
slotg 发表于 2014-11-21 23:38 | 显示全部楼层
有可能是不一样的, unsigned int 是16位数据而 unsigned long 是32位数据. block 经过左移14位之后在unsigned int 类型下前面的几个位可能已经不见了.
wangch_sh 发表于 2014-11-22 08:31 | 显示全部楼层
试一下不就知道了。
icecut 发表于 2014-11-22 08:41 | 显示全部楼层
编译器就是干这件事的.
将复杂指令拆分.然后调整顺序编译
ayb_ice 发表于 2014-11-22 10:09 | 显示全部楼层
数据可能溢出
ningling_21 发表于 2014-11-22 15:11 | 显示全部楼层
还是实际调试验证一下你的编译器
SBFX 发表于 2014-11-22 16:40 | 显示全部楼层
可能不同 block 是 unsigned int 移动14位,有的高位就移没了。
mugua521 发表于 2014-11-22 17:25 | 显示全部楼层
前排围观中,学习。。
sevenjul 发表于 2014-11-22 19:33 | 显示全部楼层
当然有可能不一样啦.
xmar 发表于 2014-11-22 21:52 | 显示全部楼层
一样.
blockPage = (block << 14) + (page << 9); 等价于:
blockPage = long (block << 14) + long (page << 9);
slotg 发表于 2014-11-23 11:21 | 显示全部楼层
xmar 发表于 2014-11-22 21:52
一样.
blockPage = (block

应该是不一样啊!

block 跟 page 会先依 int 的类别运算, 最后再转换成long的类别
qqljhang 发表于 2014-11-23 21:33 | 显示全部楼层
最保险就是直接上片子试  ,   理论分析往往不可靠,尤其是在开一些优化或是8位机上。。

评论

这个正解。不同的编译器结果不同。  发表于 2014-11-24 11:45
chenyu988 发表于 2014-11-24 11:25 | 显示全部楼层
要加强制转换吧,各位觉得呢
blockPage = ((unsigned long)block << 14) + ((unsigned long)page << 9);     //实际地址
chenyu988 发表于 2014-11-24 11:26 | 显示全部楼层
xmar 发表于 2014-11-22 21:52
一样.
blockPage = (block

先转换,在移位吧。
qqljhang 发表于 2014-11-24 22:04 | 显示全部楼层
qqljhang 发表于 2014-11-23 21:33
最保险就是直接上片子试  ,   理论分析往往不可靠,尤其是在开一些优化或是8位机上。。 ...

是的
 楼主| 晓文88 发表于 2014-11-24 22:32 | 显示全部楼层
这是我的一个设备上的程序,实践证明是后者才能正确运行。当时基本锁定这个地方了,不过心里没底,又到坛子里找找理论依据。谢谢楼上各位。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:思想超越了宇宙,思考局限在利益。

36

主题

116

帖子

1

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