인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

jeri님의 프로필 이미지
jeri

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

int 자료형에 관한 질문입니다

작성

·

240

0

데이터 자료형에 대한 설명을 해주실 때
int * int 연산은 overflow 가 나기 쉬우니 __int64 자료형을 사용하거나
중간에 (__int64) 로 캐스팅을 해주는 등 꼼수를 써서 해결해야 한다고 하셨는데
그 외에는 해결 방법이 없을까요?
구글링을 해봤는데 제가 키워드를 잘못찾은건지 마땅히 나오는 방안이 없더라고요..
예를 들어서
게임 상점에서 m 골드 짜리 hp포션을 n개 사고 싶은데(구매 개수에 제한은 없음), 제 골드는 k가 있는거죠
이 상황에서 k - m*n을 하고싶은데, m*n을 계산 했을 때 오버플로우가 발생할 수도 있잖아요
제가 생각하는 해결 방안은
m골드 짜리 아이템을 살 수 있는 최대 개수를 m*n 을 했을 때 오버플로우가 나지 않는 개수로 한정한다(혹시 실제로 게임에서 포션을 999개 단위로 살수 있는 이유가 이런 이유때문인가요?)
아니면 k-m 을 loop문으로 쭉 돌리고 k가 -가 되면 루프 중지하는 조건을 걸면 일단 오버플로우는 나지 않을거고 내부적으로 * 연산도 + 연산으로 구성되어있으니
시간 차이가 곱하기를 하는 것보다 많이 나지는 않지 않을까요???

답변 1

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

컴퓨터가 대부분 64비트 환경에서 돌아가는 요즘,
레지스터도 64비트 단위로 연산을 하기 때문에
int64를 선언하고 사용하는건 아무런 부담이 없습니다.
그리고 int32는 3억이 넘으면 아슬아슬한 반면
int64는 상상 이상으로 커서 평생 다 쓸 일이 없습니다.
따라서 hp, 데미지, gold 같은 애들은 int64로 가는게 일반적입니다.
(기획적으로 인플레이션 등을 고려해서라도, 굳이 int32로 갈 이유가 없습니다)

그럼에도 정말 int32로 가고 싶다면,
말씀하신대로 Max 수치를 체크하는 식으로 안전하게 검증을 하면 됩니다.
(루프를 도는 것은 cpu가 조금 아까워 보이네요)
정수 오버플로우 문제는 대부분 int*int만 살짝 조심하면 그만이긴 하지만,
그래도 프로젝트마다 한 두번 정도는 늘 발생하는 것 같네요.

jeri님의 프로필 이미지
jeri
질문자

감사합니다!! 

jeri님의 프로필 이미지
jeri

작성한 질문수

질문하기