2010-07-21 6 views
6

약간 문제가 있습니다. 기본적으로 코드는 다음과 같습니다.uint64_t의 용량은 얼마입니까?

uint64_t myInteger = 98930 * 98930; 
NSLog(@"%qu", myInteger); 

... 그냥 잘못되었습니다. 출력으로 '1197210308'이 표시됩니다. 이는 분명히 부정확합니다. 왜 이런 일이 일어나는 걸까요? uint64_t가 너무 작아서 분명히 18 and a half quintillion까지 올라갈 수는 없습니다. 누구든지 어떤 생각을 가지고 있습니까?

답변

9

는 작업이 해당 유형 사용한다, 그래서 첫 번째 번호를 전송 해 봅니다 :

uint64_t myInteger = (uint64_t)98930 *98930; 
+6

또는 : uint64_t myInteger = 98930UL * 98930UL; ' –

+0

그게 전부입니다. 이제 작동합니다. 감사! –

+0

또는 그 이상 : UINT64_C (98930) * UINT64_C (98930) – nall

2

내가 목표-C에 대해 잘 모르는,하지만 C에서 같은 일을, 정수 프로모션 정수 순위에서 중지 따라서 정수 오버플로가 발생합니다.

uint64_t myInteger = 98930LLU * 98930; 
8

98930는 int, 그래서 당신은 int 제공이 개 int들, 곱하고 있습니다 :보십시오. 그런 다음 uint64_t에 할당하고 있지만 너무 늦어서 이미 정확도를 잃어 버렸습니다. 피연산자 중 하나가 uint64_t 유형인지 확인하여 다른 피연산자가 해당 유형으로 강제 변환되고 곱셈이 uint64_t 곱셈으로 수행됩니다.

+0

잘 설명해 주셔서 감사합니다! –

관련 문제