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

Я не знаю много о Objective-C, но делать то же самое в C, целые акции останавливаются на целочисленном ранге , поэтому вы получаете переполнение целых чисел. Попробуйте:

uint64_t myInteger = 98930LLU * 98930; 
8

98930 является int, так что вы умножения двух int с, что дает int. Затем вы назначаете uint64_t, но уже слишком поздно, вы уже потеряли точность. Убедитесь, что один из операндов имеет тип uint64_t, поэтому другой будет принужден к этому типу, и умножение будет выполнено как умножение uint64_t.

+0

Это объясняет это, спасибо! –

Смежные вопросы