2224|7

108

帖子

0

资源

一粒金砂(中级)

stm8长整型赋值失效

最近搞一个项目,用stm8,编译环境是stvd
QQ图片20170119113234.png
读写ID都没有问题,把一个unsigned char 数组赋给一个u32位,从16位到31位,要不就是ffff,要不就是不显示,是编译器问题,还是什么问题。
此帖出自stm32/stm8论坛

回复

5863

帖子

209

资源

版主

是数据类型的问题,你8位编译器的int型一般都是16位的,而字面量没特殊指定也是int,所以像
  1. pubf[2]<<16;
复制代码

这个表达式得到结果还是int,也就是16位的,很明显是溢出了,所以16位的数据赋值到32位数据类型上,高16位是过不去的。
因此你需要进行数据类型转换,要使后面的运算结果为32位才行。所以上面的表达式把其中一个操作数转换为long即可,简单的做法就是,在16后面加个L,把16转为long型字面量,这样两个操作数的运算结果就是long了:
  1. pubf[2]<<16L;
复制代码


点评

在后面加L也不行,也是一样的结果。前面加强制也不行。  详情 回复 发表于 2017-1-19 12:00
个人签名

EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,上班摸鱼场,释放压力好地方!商家勿入!加群暗号:喵


回复

5863

帖子

209

资源

版主

貌似是unsigned long更好一点,所以应该是
  1. pubf[2]<<16UL;
复制代码

或者
  1. (unsigned long)pubf[2]<<16;
复制代码



个人签名

EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,上班摸鱼场,释放压力好地方!商家勿入!加群暗号:喵


回复

108

帖子

0

资源

一粒金砂(中级)

lcofjp 发表于 2017-1-19 11:48
是数据类型的问题,你8位编译器的int型一般都是16位的,而字面量没特殊指定也是int,所以像
这个表达式得 ...

在后面加L也不行,也是一样的结果。前面加强制也不行。

点评

我不相信……rebuild一下再调试,除非是编译器有bug,如果不行你就调调汇编代码  详情 回复 发表于 2017-1-19 12:02

回复

5863

帖子

209

资源

版主

仙景 发表于 2017-1-19 12:00
在后面加L也不行,也是一样的结果。前面加强制也不行。

我不相信……rebuild一下再调试,除非是编译器有bug,如果不行你就调调汇编代码

点评

是不行啊,我一开始也觉得是类型对齐问题,加了也不行的,我都试了,就当是编译器有问题吧  详情 回复 发表于 2017-1-19 12:36
个人签名

EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,上班摸鱼场,释放压力好地方!商家勿入!加群暗号:喵


回复

108

帖子

0

资源

一粒金砂(中级)

lcofjp 发表于 2017-1-19 12:02
我不相信……rebuild一下再调试,除非是编译器有bug,如果不行你就调调汇编代码

是不行啊,我一开始也觉得是类型对齐问题,加了也不行的,我都试了,就当是编译器有问题吧

回复

38

帖子

472

资源

一粒金砂(中级)

不是编译器的问题,位运算要注意CPU字长的问题

回复

15

帖子

0

资源

一粒金砂(中级)

分明就是代码书写的问题:后面的pbuf[x]< 因为:A|= B<

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

关闭
站长推荐上一条 1/3 下一条

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表