社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 944|回复: 7

[求助] stm8长整型赋值失效

[复制链接]

108

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-19 11:34:25 | 显示全部楼层 |阅读模式
最近搞一个项目,用stm8,编译环境是stvd
QQ图片20170119113234.png
读写ID都没有问题,把一个unsigned char 数组赋给一个u32位,从16位到31位,要不就是ffff,要不就是不显示,是编译器问题,还是什么问题。
此帖出自stm32/stm8论坛


回复

使用道具 举报

5234

TA的帖子

82

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-19 11:48:13 | 显示全部楼层
是数据类型的问题,你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,——电工们免费装β的天堂,商家勿入!加群暗号:喵
————————————————————————
少开箱,少点灯,少搭开发环境,如果你只会这些,对不起,我不认识你


回复

使用道具 举报

5234

TA的帖子

82

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-19 11:50:42 | 显示全部楼层
貌似是unsigned long更好一点,所以应该是
  1. pubf[2]<<16UL;
复制代码

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



EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵
————————————————————————
少开箱,少点灯,少搭开发环境,如果你只会这些,对不起,我不认识你


回复

使用道具 举报

108

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

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

点评

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


回复

使用道具 举报

5234

TA的帖子

82

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-19 12:02:47 | 显示全部楼层
仙景 发表于 2017-1-19 12:00
在后面加L也不行,也是一样的结果。前面加强制也不行。

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

点评

是不行啊,我一开始也觉得是类型对齐问题,加了也不行的,我都试了,就当是编译器有问题吧  详情 回复 发表于 2017-1-19 12:36
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵
————————————————————————
少开箱,少点灯,少搭开发环境,如果你只会这些,对不起,我不认识你


回复

使用道具 举报

108

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-1-19 12:36:49 | 显示全部楼层
lcofjp 发表于 2017-1-19 12:02
我不相信……rebuild一下再调试,除非是编译器有bug,如果不行你就调调汇编代码

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


回复

使用道具 举报

38

TA的帖子

472

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-19 15:21:43 | 显示全部楼层
不是编译器的问题,位运算要注意CPU字长的问题


回复

使用道具 举报

15

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-2-6 15:34:26 | 显示全部楼层
分明就是代码书写的问题:后面的pbuf[x]<<y要整体加上括号。
因为:A|= B<<C 即 A=A|B<<C,|的优先级要高于<<,所以A=(A|B)<<C,而不是A=A|(B<<C)。


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-2-23 08:52 , Processed in 0.219900 second(s), 17 queries , Redis On.

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