浮动对齐不正确

Tia*_*sta 1 c++

我有以下课程

class Viewport
{
public:
    Viewport();
    ~Viewport();

    void setSize(float x, float y);

private:
    float  _X;
    float  _Y;
};

void Viewport::setSize(float x, float y)
{
    //Conditionals used to make sure that the viewport stays inside the [0.0f, 1.0f] range

    if(x < 0.0f)
        _X = 0.0f;
    else if(x > 1.0f)
        _X = 1.0f;
    else
        _X = x;

    if(y < 0.0f)
        _Y = 0.0f;
    else if(y > 1.0f)
        _Y = 1.0f;
    else
        _Y = y;

}
Run Code Online (Sandbox Code Playgroud)

我创建了视口矢量

Viewport vps[3];

uint _NumCascades = 3;

for(uint i = 0; i < _NumCascades; i++)
    vps[i].setSize(i * (1.0f/_NumCascades), 0.0f);
Run Code Online (Sandbox Code Playgroud)

i == 1i==2在线时发生奇怪的错误,_X = x;因为它_X被分配了值1051372203而不是0.33333334f

Mar*_*k B 8

所有属性,尤其是_X和_Y,都是为编译器保留的,并且编译器使用_X(因为它太短)而不是其他东西并且让代码混淆是不可能的.

C++语言保留以实现的下划线开头的名称子集.在这种情况下,所有范围/案例都保留下划线和主要资本.这些规则并不是非常复杂,但为了防止意外使用保留名称,最简单的方法是避免在标识符上引入下划线.


Dan*_*her 5

1051372203 0x3eaaaaab的位模式是IEEE754格式的float值的位模式1.0f/3.因此赋值工作,并且在某些地方,位模式被解释为整数.因为i == 0,int(或unsigned int)0和float0 的位模式是相同的.

无法从发布的代码中推断出发生这种情况.