编写单片机IO口驱动,提示warning: #61-D: integer operation result is out of range

本文探讨了在C语言中使用宏定义设置GPIO时遇到的编译警告,由于32位有符号整数运算可能导致溢出。通过将运算符转换为`uint32`类型,解决了警告并确保了符号位安全。关键在于理解类型转换对防止溢出的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 宏定义如下:

#define    nGPIO_MODE_HSET(m,p,n)    SYS->GP##p##_MFPH =(SYS->GP##p##_MFPH & (~(1<<(4*(n-8)))));    P##p##->MODE = (P##p##->MODE &(~( 3<<(n<<1))) | ( m<<(n<<1)))

2 函数调用
nGPIO_MODE_HSET(OUT_GPIO, D, 15);

3编译结果

Source\output\output.c(150): warning:  #61-D: integer operation result is out of range
      
GPIO_MODE_HSET(OUT_GPIO, D, 15);//PD.15设置为输出,辅助位置1

4 查明原因:
编译器默认signed int即32位有符号整数类型,而1<<31实际为0x80000000,这样就有可能改写了符号位(最高位)

5 修改宏定义

#define    nGPIO_MODE_HSET(m,p,n)    SYS->GP##p##_MFPH =(SYS->GP##p##_MFPH & (~((uint32)1<<(4*(n-8)))));    P##p##->MODE = (P##p##->MODE &(~( (uint32)3<<(n<<1))) | ( m<<(n<<1)))

编译警告消失

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值