2

次の関数では、異常な値を受け取っています。

(ハンガリー語表記は考慮しないでください。私は古い情報源の規則に従っています)

int nMaxHP = m_pDefender->GetMaxHitPoint();
u_long nPercentHP = 0;
if( nMaxHP > 0 )
    nPercentHP = (  nHP * 100 ) / nMaxHP;

CString show;
show.Format( "%u %d %d", nPercentHP, nMaxHP, nHP );
pUserAttacker->AddTextD3D( show, 0xffff0000 );

これはゲーム クライアントのダメージ コードの一部でありm_pDefender、大きなライオンの柱でnHPあり、ダメージを受けた後のヒットポイントであり、一目瞭然nMaxHPです。 AddTextD3D( CString format, DWORD color )画像でわかるように、メッセージを表示します。 スクリーンショット

つまり、
34.000.000 = nMaxHP
33.999.999 = nHP

33.999.999 * 100 = 3.399.999.900
3.399.999.900 / 34.000.000 = 99 (倍精度では 99.99999705882353)

問題は、なぜnPercentHP4294967270 なのかということです。

4

1 に答える 1

4

計算が 32 ビット算術最大値を超えています。

最初にすべてを double に変換します

于 2012-09-18T21:25:55.117 に答える