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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版