2010-07-21 17 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;' – 2010-07-21 20:45:56

+0

就是這樣。它現在有效。謝謝! – 2010-07-21 20:52:50

+0

甚至更​​好:UINT64_C(98930)* UINT64_C(98930) – nall 2010-07-21 21:16:38

2

我不知道很多關於客觀-C,但在C做同樣的,整數促銷停在整數排名,所以你得到一個整數溢出。嘗試:

uint64_t myInteger = 98930LLU * 98930; 
8

98930是int,所以你乘以2個int s,這給出了一個int。然後,您將分配給uint64_t,但已經太遲了,您已經失去了精確度。確保其中一個操作數的類型爲uint64_t,所以另一個將被強制爲該類型,並且乘法將作爲uint64_t乘法完成。

+0

這解釋得很好,謝謝! – 2010-07-21 20:55:37