2009-04-19 35 views
6

En otras palabras, ¿esto funciona como se esperaba?32bit int * 32bit int = 64 bit int?

int32 i = INT_MAX-1; 
int64 j = i * i; 

o necesito lanzar primero el i a 64 bit?

+2

Depende de lo que esperas, pero Will tiene razón en lo que sucede, y probablemente no sea lo que esperas. –

+0

Visite: http://stackoverflow.com/questions/245740/which-variables-should-i-typecast-would-doing-math-operations-in-cc/245986#245986 –

Respuesta

17

Debe lanzar al menos uno de los operandos al multiplicador. En el momento en que se realiza la multiplicación, el sistema no sabe que está planeando asignar un int64.

(Int64 A menos que es en realidad el tipo int nativo para su sistema en particular, lo que parece poco probable)

+4

El truco común es multiplicar primero por 1L de fundición: int64 j = 1L * i * i; Esto funciona si su longitud tiene 64 bits de longitud. – stepancheg

+3

Y si su 'long' solo tiene 32 bits, puede usar 1LL en la mayoría de los compiladores modernos. –

+1

O podría usar INT64_C (1) de stdint.h para hacerlo razonablemente portátil (es posible que necesite extraer un stdint.h para compiladores de MS, quizás de MinGW o de http://www.azillionmonkeys.com/qed/ pstdint.h –

7

Depende de lo int32 y son Int64.

En resumen, todos los enteros son promovidos al menos al tamaño 'int' (que puede ser de 64 bits) antes de cualquier operación aritmética, y al tamaño del operando más grande para operadores binarios si este es de mayor rango que un int .

El modo en que se utiliza el resultado de una expresión (independientemente de que esté almacenado en un tipo más amplio) no tiene relación con las promociones de las partes constituyentes de la expresión.

+0

+1 para explicar en lugar de prescribir –

0

Dado dos números a, b y cada número usa len_a y len_b bits.

Su tipo de datos de salida necesita al menos: len_a y len_b bits.

En su código anterior, tiene dos números de 31 bits (porque INT_MAX - 1 = 0x7FFFFFFE utiliza 31 bits) y tendrá que convertir uno de ellos a int64_t porque hará una multiplicación de 32 bits y desbordamiento antes lanza a int64_t.


El número de bits necesarios para el punto de multiplicación fija:

len_output = howManyBits(a * b) 
      = len_a + len_b 

Un ejemplo rápido para mostrar la regla anterior en acción:

a  = 7 
len_a = 3 

b  = 7 
len_b = 3 

c = a * b 
    = 49 (decimal) 
    = 0x31 (hex) 

len_c = howManyBits(0x31) 
     = 6 

Puede escribir una función para contar los bits . O si solo quieres un control de cordura rápido para confirmar esto, utiliza algo como Windows Calc que convertirá el número en forma binaria y contará los bits utilizados.

3

La respuesta básica es no, no hará lo que quiera.
Pero hace lo que se espera.

Dos cosas a tener en cuenta acerca de las operaciones matemáticas:

  • Ambos operandos serán del mismo tipo.
  • El tipo resultante será el mismo que la entrada.

Si el compilador observa un desfase entre los operandos que someterá a conversión uno de los operandos para que tanto partido (ver Which variables should I typecast when doing math operations in C/C++?). Nota: Esto se hace de forma aislada a lo que sucede con el resultado.