2010-07-21 9 views
6

Ho un piccolo problema. In sostanza, il codice:Capacità di un uint64_t?

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

... solo sbagliato. Ottengo '1197210308' come output, che è evidentemente errato. Perché sta succedendo? Non può essere che un uint64_t sia troppo piccolo, dato che apparentemente vanno a 18 and a half quintillion. Qualcuno ha qualche idea?

risposta

9

Prova a trasmettere il primo numero così l'operazione viene effettuata utilizzando tale tipo:

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

Oppure: 'uint64_t myInteger = 98930UL * 98930UL;' –

+0

Questo è tutto. Ora funziona. Grazie! –

+0

O ancora meglio: UINT64_C (98930) * UINT64_C (98930) – nall

2

io non ne so molto di Objective-C, ma facendo lo stesso in C, promozioni interi fermano al rango intero , quindi ottieni un overflow intero. Prova:

uint64_t myInteger = 98930LLU * 98930; 
8

98930 è un int, in modo che stai moltiplicando due int s, che dà un int. Stai quindi assegnando a un uint64_t, ma è troppo tardi, hai già perso la precisione. Assicurati che uno degli operandi sia di tipo uint64_t, quindi l'altro sarà forzato a quel tipo e la moltiplicazione verrà eseguita come moltiplicazione uint64_t.

+0

Questo lo spiega bene, grazie! –

Problemi correlati