2009-03-28 14 views
12
int64_t a = 1234; 

    double d = (double) a; 

¿Es esta la manera recomendada?Convierte int64_t en el doble

+1

int64 no siempre se asigna bien al doble. por ejemplo, compare el valor máximo de un doble y el valor máximo de int64. también tenga en cuenta que el doble tiene 57 bits de enteros, más alto que el que omite algunos enteros que no se pueden representar en doble formato. mientras que int64 tiene 64 bits de enteros, todos adyacentes a su vecino por 1. son rangos de números muy diferentes. –

Respuesta

6

Debe utilizar static_cast o confiar en la conversión implícita en su lugar:

int64_t a = 1234; 
double d = static_cast<double>(a); 
double f = a; 
11

uso static_cast como respuestas Strager. Recomiendo contra utilizando la conversión implícita (o incluso una conversión de estilo C en C++ código fuente) por varias razones:

  • conversiones implícitas son una fuente común de las advertencias del compilador, lo que significa que podría estar añadiendo ruido a la compilación (ahora o más tarde cuando se agregan mejores indicadores de advertencia).
  • El próximo programador de mantenimiento que se encuentre detrás de usted verá un modelo implícito, y necesita saber si fue un comportamiento intencional o un error/error. Tener ese static_cast hace su intento inmediatamente obvio.
  • static_cast y los otros moldes de estilo C++ son fáciles de manejar para grep.
+4

En "intento": especialmente cuando la asignación está lejos de la declaración de d, static_cast viola DRY. d = static_cast (a) es mejor en ese sentido, pero luego pierdo la voluntad de vivir y pensar que quizás d = a sería mejor después de todo ;-) –

+0

Tienes razón en que viola DRY ... pero C++ como un idioma no es SECO de todos modos, si considera las declaraciones avanzadas. Además, IIRC, typeof (d) requiere RTTI y , que no se puede usar en algunos entornos. – Tom

+0

... aunque tienes razón ... la violación DRY causaría un código extraño si alguien realiza una refactorización incompleta. flotar d; d = static_cast (valor); // WTF – Tom

3

Para los tipos POD ambas versiones hacen lo mismo. Elija el que prefiera y sea consecuente.

Conozco a muchas personas que prefieren lo primero para mecanografiar/legibilidad y estoy de acuerdo con esto, pero puedo vivir con cualquiera de los dos.

He escuchado el argumento "fácil de grep para" muchas veces, pero todavía tengo que encontrar una situación donde he necesitado grep mi base de código para POD moldes.

+2

+1, nunca he tenido que grep para moldes tampoco –

2

también puede utilizar la sintaxis de conversión, que es equivalente a una static_cast:

int64_t a = 1234; 
double d = double(a); 

Esta es una construcción sintáctica útil, ya que permite que los tipos primitivos y de la clase a ser tratados de la misma manera en código de la plantilla, ya sea haciendo static_cast, para la primitiva, o invocando a un constructor, para el tipo de clase.