Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 整数溢出错误_C++_Integer Overflow - Fatal编程技术网

C++ 整数溢出错误

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

这是我的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;
}


在添加浮动之前,请尝试将
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;