duda conceptual C++
Felipe
kelt3we en gmail.com
Lun Mayo 30 04:48:18 CLT 2011
On 05/30/2011 03:37 AM, Joe Cabezas wrote:
> excelente respuesta, no sabia que los numeros eran interpretados como double
>
> cual es la diferencia con el static_cast?
>
> finalmente lo resolvia asi:
>
> float mm = 0.4;
> float nn = 2.8;
> int xx = 3;
>
> float c1 = (mm * xx + nn);
> int c2 = c1;
>
> cout << "c1: " << c1 << endl;
> cout << "c2: " << c2 << endl;
>
> lo que me sorprende es que en distintos sistema que se suponen ocupan el
> mismo sistema o el mismo compilador den resultados distintos..., tu que
> sabes, como explicas esto?
>
> muchas gracias por el tiempo de atender mi duda, te lo agradezco un monton.
>
> -Joe
Hay muchas cosas que mencioné que estaban mal y le debo haber alegrado
el día a mas de algún listero:
- En la parte final el código había un 1 en lugar de un 3 haciendo que
todo el ejemplo esté mal, epic fail.
- En la sección sobre las conversiones implícitas en operaciones
aritméticas, funciona distinto (promoción de tipos): antes de realizarse
la operación, si los tipos son distintos, el tipo de menor precisión se
convierte al de mayor precisión. Adicionalmente pueden haber más
conversiones implícitas, por ejemplo, antes de almacenar el resultado en
una variable de tipo distinto.
g++ tiene muchas versiones, muchos flags (distintos optimizaciones,
distintos sets de instrucciones, etc.), está en muchas arquitecturas y
en resumen hay muchas combinaciones posibles que se pueden dar. Habría
que ver que flags se usaron, que versión fue y en qué arquitectura pasó.
Y tambien existen casos extremos como el mítico bug FDIV de las FPU de
los procesadores Pentium que hacía que las divisiones de punto flotante
dieran resultados erróneos.
Sobre el operador static_cast: Hay varios operadores de conversión de
tipos en C++: static_cast, dynamic_cast, reinterpret_cast, const_cast.
Este post lo explica en horrendo detalle:
http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-and-reinterpret-cast-be-used/332080#332080
Saludos,
Felipe
Más información sobre la lista de distribución Linux