你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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;

有啥需要注意的的么?
收藏 评论4 发布时间:2017-7-30 16:10

举报

4个回答
废鱼 回答时间:2017-7-31 10:25:20
编译器认为定义的是int型的。因此会超出范围,修改如下:
volatile uint32_t temp0 = (uint32_t)0x0000FFFF << 16;

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

MrJiu 回答时间:2017-7-31 10:34:10
你把改成这样,就不会提示了
volatile uint32_t temp0 = (uint32)0x0000FFFF << 16;
提示的原因很简单,就是你把数据写成0x0000FFFF这样,并不表示是32位数据,而实际可能是16位的数据;16位的数据,移位超过16,编译器给出警告是很正常的。当然了,写成0x0001FFFF这样,就是32位的数据了。。。所以最好使用的时候,前面加一个强制转换。。。

评分

参与人数 1ST金币 +3 收起 理由
zero99 + 3

查看全部评分

Dandjinh 回答时间:2017-7-31 11:32:28
0x0000FFFF编译器默认的是有符号的,你左移16位,最高位变成1,对应的数值就变成负值,由于负值的补码和正值的补码方式不一样,所以编译器一般都会警告下,可以忽略,如果嫌麻烦,你可以这样写
volatile uint32_t temp0 = 0x0000FFFFUL << 16;
这个UL后缀就告诉编译器这是无符号长整形

评分

参与人数 1ST金币 +3 收起 理由
zero99 + 3

查看全部评分

(a_a) 回答时间:2017-8-2 23:21:31
@安 @MrJiu @Dandjinh
感谢楼上3位,不一一回复了,
我是想的既然定义了 uint32_t  为啥还给我发警告,忽略了立即数也得给个规范,谢谢!
虽然运行没有问题,但既然发出了警告,我怕出现莫名错误,已修改了实现方式,让它无警告,

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版