你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
uint32_t temp0 = 0x0000FFFF << 16; 编译时发出警告
[复制链接]
(a_a)
提问时间:2017-7-30 16:10 /
ad.c(261): warning: #61-D: integer operation result is out of range
volatile uint32_t temp0 = 0x0000FFFF << 16;
ad.c(261): warning: #68-D: integer conversion resulted in a change of sign
volatile uint32_t temp0 = 0x0000FFFF << 16;
有啥需要注意的的么?
赞
0
收藏
0
评论
4
分享
发布时间:2017-7-30 16:10
举报
请先
登录
后回复
4个回答
废鱼
回答时间:2017-7-31 10:25:20
a0a.1 0b0c
编译器认为定义的是int型的。因此会超出范围,修改如下:
volatile uint32_t temp0 = (uint32_t)0x0000FFFF << 16;
评分
参与人数
1
ST金币
+2
收起
理由
zero99
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
MrJiu
回答时间:2017-7-31 10:34:10
a0a.1 0b0c
你把改成这样,就不会提示了
volatile uint32_t temp0 = (uint32)0x0000FFFF << 16;
提示的原因很简单,就是你把数据写成0x0000FFFF这样,并不表示是32位数据,而实际可能是16位的数据;16位的数据,移位超过16,编译器给出警告是很正常的。当然了,写成0x0001FFFF这样,就是32位的数据了。。。所以最好使用的时候,前面加一个强制转换。。。
评分
参与人数
1
ST金币
+3
收起
理由
zero99
+ 3
查看全部评分
赞
0
评论
回复
支持
反对
Dandjinh
回答时间:2017-7-31 11:32:28
a0a.1 0b0c
0x0000FFFF编译器默认的是有符号的,你左移16位,最高位变成1,对应的数值就变成负值,由于负值的补码和正值的补码方式不一样,所以编译器一般都会警告下,可以忽略,如果嫌麻烦,你可以这样写
volatile uint32_t temp0 = 0x0000FFFFUL << 16;
这个UL后缀就告诉编译器这是无符号长整形
评分
参与人数
1
ST金币
+3
收起
理由
zero99
+ 3
查看全部评分
赞
0
评论
回复
支持
反对
(a_a)
回答时间:2017-8-2 23:21:31
a0a.1 0b0c
@安 @MrJiu @Dandjinh
感谢楼上3位,不一一回复了,
我是想的既然定义了 uint32_t 为啥还给我发警告,忽略了立即数也得给个规范,谢谢!
虽然运行没有问题,但既然发出了警告,我怕出现莫名错误,已修改了实现方式,让它无警告,
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
volatile uint32_t temp0 = (uint32_t)0x0000FFFF << 16;
评分
查看全部评分
volatile uint32_t temp0 = (uint32)0x0000FFFF << 16;
提示的原因很简单,就是你把数据写成0x0000FFFF这样,并不表示是32位数据,而实际可能是16位的数据;16位的数据,移位超过16,编译器给出警告是很正常的。当然了,写成0x0001FFFF这样,就是32位的数据了。。。所以最好使用的时候,前面加一个强制转换。。。
评分
查看全部评分
volatile uint32_t temp0 = 0x0000FFFFUL << 16;
这个UL后缀就告诉编译器这是无符号长整形
评分
查看全部评分
感谢楼上3位,不一一回复了,
我是想的既然定义了 uint32_t 为啥还给我发警告,忽略了立即数也得给个规范,谢谢!
虽然运行没有问题,但既然发出了警告,我怕出现莫名错误,已修改了实现方式,让它无警告,