c ++从long转换为float奇怪的错误

时间:2013-06-03 23:07:20

标签: c++ casting window

        POINT p;
        RECT rec;

        ::GetClientRect(hWnd, &rec);
        LONG windowWidth = rec.right, windowHeight = rec.bottom;

        ::GetCursorPos(&p);//get position on screen
        ::ScreenToClient(hWnd,&p);//convert POINT to position in window

        // 2d vector math
        float x=0.0f,y=0.0f; // vector
        x= static_cast<float>(p.x - (windowWidth>>1)); // problem...
        y= static_cast<float>(p.y - (windowHeight>>1));

        char buf[100];
        sprintf_s(buf, "x: %d, y: %d\n", x,y); // create string to print
        OutputDebugStringA(buf); // print to debut window

当我将x和y打印到控制台时,它给了我疯狂的数字。看起来长时间投掷会丢失一些数据,但为什么呢?不应该有任何问题。

打印:
x:0,y:1080795136

4 个答案:

答案 0 :(得分:5)

 sprintf_s(buf, "x: %d, y: %d\n", x,y); 

应该是

 sprintf_s(buf, "x: %f, y: %f\n", x,y); 

因为xyfloat类型,而不是整数。

答案 1 :(得分:3)

如果你使用%d格式并传递一个浮点数(实际上是作为double传递),难怪你会得到垃圾。你可能会变得更糟。尝试%f格式,或转换为%d预期的int。

答案 2 :(得分:3)

只需修改为

sprintf_s(buf, "x: %f, y: %f\n", x,y);

因为你正在使用花车

答案 3 :(得分:2)

可能是因为您在sprintf_s调用中使用了%d吗?尝试使用%f代替,看看是否存在问题。