2010-07-21 20 views
6

Tengo un pequeño problema. Esencialmente, el código:Capacidad de uint64_t?

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

... simplemente lo hace mal. Obtengo '1197210308' como salida, lo cual es evidentemente incorrecto. ¿Por qué está pasando esto? No puede ser que un uint64_t sea demasiado pequeño, ya que aparentemente van hasta el 18 and a half quintillion. ¿Alguien tiene alguna idea?

Respuesta

9

Prueba a transmitir el primer número por lo que se hace la operación utilizando ese tipo:

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

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

+0

Eso es todo. Ahora funciona. ¡Gracias! –

+0

O incluso mejor: UINT64_C (98930) * UINT64_C (98930) – nall

2

no sé mucho acerca de Objective-C, pero hacer lo mismo en C, promociones enteros parada en el rango entero , entonces obtienes un desbordamiento de enteros. Proveedores:

uint64_t myInteger = 98930LLU * 98930; 
8

98930 es un int, por lo que está multiplicando dos int s, lo que da una int. Entonces estás asignando un uint64_t, pero es demasiado tarde, ya has perdido la precisión. Asegúrese de que uno de los operandos sea del tipo uint64_t, de modo que el otro será forzado a ese tipo, y la multiplicación se realizará como multiplicación uint64_t.

+0

Eso lo explica bien, ¡gracias! –

Cuestiones relacionadas