2
다음 함수에서 비정상적인 값을 받았습니다.% 함수가 비정상적인 값을 계산합니다.
nHP
는 체력이다,
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
는 큰 사자 기둥이다 (I 오래된 소스의 규칙에 따라하고있어, 헝가리어 표기법을 disconsider하시기 바랍니다) 그는 피해를 입은 후 가지고 있으며 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 on double precision)
질문은 이유는 nPercentHP
은 4294967270입니까?
명시 적 캐스트가 부족합니까? –
글쎄, 만약'nHP'가 32 비트 변수를 가진 서명 된 변수라면 중간 결과가 30 억을 넘기 때문에 방금 오버 플로우되어 정의되지 않은 동작을 일으킨 것입니다. – chris
오류가 여기에 'nHP * 100', 맞습니까? –