2013-04-19 2 views
2

다음과 같은 코드 행을 사용하여 총 수/백분율을 계산합니다.Windows에서 C로 백분율을 계산하십시오.

의 Microsoft Visual C++에서

2005

printf("Count = %lu (%.2lf%%)\n", count, (double)count/(double)total*100.0); 

GCC에서

printf("Count = %lu (%.2lf\%)\n", count, (double)count/(double)total*100.0); 

모두 "수"와 "총"부호없는 64 비트 정수입니다. 어떤 이유로 gcc에서 올바른 값을 얻을 수 있지만 항상 Visual C++에서 0.00 %를 얻습니다.

Windows에서 올바른 값을 가져올 수없는 이유는 무엇입니까?

답변

2

%lu은 부호가없는 long int을 인쇄합니다. Visual C++에서이 값은 64 비트 정수가 아닌 32 비트 정수입니다. "count"는 64 비트 정수이므로 "long int"가 아닙니다. (당신은 __int64 count; 또는 long long int count;로 선언해야합니다, 그렇지? 어떻게 다른 당신은 비주얼 C++ 2005에서 64 비트 정수 변수를 선언 할 것인가?) printf 이후

더 당신이 통과 한 것을 인수 아이디어 나 얼마나 큰 그들이이 없습니다 , 형식 문자열을 사용하여 각 인수에 대해 스택에서 데이터를 가져올 바이트 수를 알려줍니다. %lu을 작성하여 "count"에 대해 4 바이트 (32 비트)의 데이터를 제거하도록 지시했지만, 64 비트 정수 변수 "count"를 printf에 전달할 때 8 바이트 (64 비트)의 데이터를 전달했습니다. 따라서 스택에 4 바이트가 남습니다. 그런 다음 printf이 백분율로 8 바이트 (64 비트)의 "double"을 제거하면 "count"에서 남은 4 바이트로 끝납니다. Intel x86 CPU는 리틀 엔디안이므로 이러한 바이트는 거의 확실하게 00000000입니다.

짧은 대답 : Visual C++에서 부호없는 64 비트 값을 인쇄하려면 %I64u 또는 %llu을 작성하십시오.

+0

감사합니다. 그게 정확히 무슨 일이야 그리고 지금은 작동합니다! – Rayne

관련 문제