C++ 整数溢出错误
这是我的OpenGL代码的一部分,我得到一个错误:C++ 整数溢出错误,c++,integer-overflow,C++,Integer Overflow,这是我的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; curB
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;
}
在添加浮动之前,请尝试将
RAND_MAX
转换为浮动
curBall->x=((float)rand()/( ((float)RAND_MAX) +1))*(ww-1) +1;
等等
RAND_MAX
通常等于INT_MAX
,一个整数所能容纳的最大值,因此当它仍然被认为是整数时,加上1会使它超过整数限制。可能是RAND_MAX+1
溢出,由于RAND_MAX很可能是==INT_MAX
我猜你的RAND_MAX
等于你的INT_MAX
,所以你所有的RAND_MAX+1
片段都溢出了。由于这两个都是常量,编译器可以在编译时检测到它。这可能取决于您的编译器,如果RAND\u MAX==MAX\u INT,那么RAND\u MAX+1将溢出。此外,我怀疑假设32位浮点和INT,(static\u cast(RAND\u MAX)+1.0f)=static\u cast(RAND\u MAX)
因为浮点中没有足够的位来表示每个整数,加法只会向下截断。我同意这是解决方案,所以我不打算发表我自己的解决方案,但值得注意的是,您的两个变量dir和rot的形式不同(一个以弧度表示,一个以度表示)。这可能会给你带来一些麻烦:)在那里,做了那件事!它起作用了。。现在我面临一个小问题。。这是游戏代码的一部分。。错误出现在linux中,但不在windows中。。在windows中,它工作正常,但即使在我纠正了这个错误之后,linux也只是向我显示窗口。。游戏运行不正常..:(在Windows中,RAND_MAX要小得多,我认为它只有15位?0x7FFF?现代Unix风格的操作系统使用32位。您可以尝试printf(“%d\n”,RAND_MAX))
查看它在每个目标平台上的效果。如果RAND_MAX为32位,则加上1可能不会触发到下一个最大值的滚动。请记住,32位浮点只有23位尾数。您需要使用双精度。
curBall->x=((float)rand()/( ((float)RAND_MAX) +1))*(ww-1) +1;