整数溢出错误

3
这是我的OpenGL代码的一部分,我遇到了以下错误:
struct Ball {
    float x;
    float y;
    float rot;
    float dir;
    bool rmv;
    Ball* next;
};

Ball* curBall;
void addBall() {
    if (balls==NULL) {
        balls=new Ball;
        balls->next=NULL;
        curBall=balls;
    } else {
        curBall->next=new Ball;
        curBall=curBall->next;
        curBall->next=NULL;
    }
    curBall->x=((float)rand()/(float)(RAND_MAX+1))*(ww-1) +1;
    curBall->y=((float)rand()/(float)(RAND_MAX+1))*(wh-1) +1;
    curBall->dir=((float)rand()/(float)(RAND_MAX+1))*(2*PI-1) +1;
    curBall->rot=((float)rand()/(float)(RAND_MAX+1))*(359) +1;
    curBall->rmv=false;
}

error :
In function ‘void addBall()’:
file.cpp:120: warning: integer overflow in expression
file.cpp:121: warning: integer overflow in expression
file.cpp:122: warning: integer overflow in expression
file.cpp:123: warning: integer overflow in expression
4个回答

13

尝试在将其加上之前,将RAND_MAX转换为浮点数。

curBall->x=((float)rand()/( ((float)RAND_MAX) +1))*(ww-1) +1;

等等其他东西。 RAND_MAX通常等于INT_MAX,即整数可以容纳的最大值,因此在它仍被视为整数的情况下将其加1会使它超过整数限制。


2
此外,我认为假设32位浮点数和整数,(static_cast<float>(RAND_MAX) + 1.0f) == static_cast<float>(RAND_MAX),因为在浮点数中没有足够的位来表示每个整数,加法将被截断回去。 - Mark B
1
我同意这是解决方案,所以我不会发表自己的观点,但值得注意的是,你的两个变量dir和rot处于不同的形式(一个是弧度,一个是角度)。这可能会在未来给你带来一些麻烦 :) 我也曾经历过! - corsiKa
它起作用了...现在我面临一个小问题...这是游戏代码的一部分...错误出现在Linux中,但在Windows中没有出现...在Windows中它正常工作,但即使我纠正了这个错误,Linux仍然只显示窗口...游戏不能正常运行... :( - Nagaraj Tantri
在Windows中,RAND_MAX要小得多,我认为只有15位吧?0x7FFF?现代Unix风格的操作系统使用32位。您可以尝试printf(“%d \ n”,RAND_MAX);来查看您正在针对的每个平台的结果。 - dash-tom-bang
如果RAND_MAX是32位,则加1不太可能触发溢出到下一个最大值。请记住,32位浮点数仅具有23位尾数。您需要使用双精度浮点数。 - dash-tom-bang
但即使使用double,它也不能显示图形(实现移动球撞击目标),但在Windows中它可以正常工作。在Linux中,我只能得到图形窗口而没有对象显示:(.. 我需要在Linux中实现这个项目。 - Nagaraj Tantri

2

可能是 RAND_MAX + 1 溢出了,因为 RAND_MAX 可能等于 == INT_MAX


2
我猜测你的 RAND_MAX 等于你的 INT_MAX,所以你的所有 RAND_MAX+1 都会溢出。由于它们都是常量,编译器可以在编译时检测到这一点。

2

如果RAND_MAX == MAX_INT,那么它可能取决于您的编译器,RAND_MAX+1将会溢出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接