2012-09-18 3 views
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)은 이미지에서 볼 수있는 메시지를 보여줍니다. Screenshot

건이며,
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입니까?

+0

명시 적 캐스트가 부족합니까? –

+1

글쎄, 만약'nHP'가 32 비트 변수를 가진 서명 된 변수라면 중간 결과가 30 억을 넘기 때문에 방금 오버 플로우되어 정의되지 않은 동작을 일으킨 것입니다. – chris

+0

오류가 여기에 'nHP * 100', 맞습니까? –

답변

4

계산이 32 비트 산술 최대 값을 초과합니다.

먼저 두 가지를 모두 변환하십시오.

관련 문제