打印
[牛人杂谈]

integer operation result is out of range

[复制链接]
1247|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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++)
            {  

            }
         }

使用特权

评论回复
5
wahahaheihei|  楼主 | 2018-2-27 13:28 | 只看该作者
大家不妨试试看。

使用特权

评论回复
6
598330983| | 2018-2-27 14:48 | 只看该作者
原来如此。溢出了

使用特权

评论回复
7
643757107| | 2018-2-27 17:37 | 只看该作者
也可能是其他原因

使用特权

评论回复
8
643757107| | 2018-2-27 17:37 | 只看该作者
我一般都是忽略这个警告。

使用特权

评论回复
9
643757107| | 2018-2-27 17:37 | 只看该作者
警告只是编译器的建议,,编译器是死的,人是活动。

使用特权

评论回复
10
xinpian101| | 2018-2-27 19:29 | 只看该作者
看这个解释,应该不管也没事

使用特权

评论回复
11
zhuotuzi| | 2018-2-27 19:30 | 只看该作者
当左移31位时,常数就变成负数   好可怕。

使用特权

评论回复
12
zhuotuzi| | 2018-2-27 19:31 | 只看该作者
之前那个说printf的是不是遇到了这个故障造成的。

使用特权

评论回复
13
小明的同学| | 2018-2-27 23:14 | 只看该作者
这个溢出一般就是错误了。

使用特权

评论回复
14
捉虫天师| | 2018-2-28 22:34 | 只看该作者
这个最好就是用什么样的数据就定义什么类型,尽量避免数据转换操作。

使用特权

评论回复
15
捉虫天师| | 2018-2-28 22:35 | 只看该作者
数据转换可能会跟你预想的不同,这个跟编译器关系很大。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

215

主题

3026

帖子

12

粉丝