[牛人杂谈] integer operation result is out of range

[复制链接]
 楼主| wahahaheihei 发表于 2018-2-27 13:25 | 显示全部楼层 |阅读模式

在编写测试程序的过程中,有如下定义:

#define UART1_EN              (1<<31)

编译后编译器报错:

integer operation result is out of range (61-D),经查资料是由于溢出所致,宏定义默认常量是有符号型,当左移31位时,常数就变成负数,编译器就会给出如上的警告信息解决办法是强制类型转换成无符号类型:

#define UART1_EN              ((U32)1<<31)

这样,警告信息就消除了。


 楼主| wahahaheihei 发表于 2018-2-27 13:26 | 显示全部楼层
其实不必惊慌,警告一般不碍事。
 楼主| wahahaheihei 发表于 2018-2-27 13:28 | 显示全部楼层
#define  j 7000
u16 i ;
i=j * 5 ;
IAR下编译警告:Warning[Pe061]: integer operation result is out of range
7000*5=35000 < 65535
查到原因:
赋值前,7000×5是作为有符号整数来计算,溢出了,改为(u16)7000*(u16)5(强制为无符号)就是无符号的计算了,一切OK。。。。
 楼主| wahahaheihei 发表于 2018-2-27 13:28 | 显示全部楼层
int i,j,k;
   
        for(j=0;j<6;j++)
        {  
            for(i=0;i< (u16)240*(u16)240;i++)
            {  

            }
         }
 楼主| wahahaheihei 发表于 2018-2-27 13:28 | 显示全部楼层
大家不妨试试看。
598330983 发表于 2018-2-27 14:48 来自手机 | 显示全部楼层
原来如此。溢出了
643757107 发表于 2018-2-27 17:37 | 显示全部楼层
也可能是其他原因
643757107 发表于 2018-2-27 17:37 | 显示全部楼层
我一般都是忽略这个警告。
643757107 发表于 2018-2-27 17:37 | 显示全部楼层
警告只是编译器的建议,,编译器是死的,人是活动。
xinpian101 发表于 2018-2-27 19:29 | 显示全部楼层
看这个解释,应该不管也没事
zhuotuzi 发表于 2018-2-27 19:30 | 显示全部楼层
当左移31位时,常数就变成负数   好可怕。
zhuotuzi 发表于 2018-2-27 19:31 | 显示全部楼层
之前那个说printf的是不是遇到了这个故障造成的。
小明的同学 发表于 2018-2-27 23:14 | 显示全部楼层
这个溢出一般就是错误了。
捉虫天师 发表于 2018-2-28 22:34 | 显示全部楼层
这个最好就是用什么样的数据就定义什么类型,尽量避免数据转换操作。
捉虫天师 发表于 2018-2-28 22:35 | 显示全部楼层
数据转换可能会跟你预想的不同,这个跟编译器关系很大。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

231

主题

3196

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部