2010-07-21 15 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