La aritmética de modo mixto (aritmética entre operandos de diferentes tipos y/o tamaños) es legal pero frágil. El estándar C define reglas para la promoción de tipos para convertir los operandos a una representación común. La promoción automática de tipos permite al compilador hacer algo sensato para las operaciones en modo mixto, pero "sensible" no significa necesariamente "correcto".
Para saber realmente si el comportamiento es correcto o no, primero debe comprender las reglas de promoción y luego comprender la representación de los tipos de datos. En términos muy generales:
- más corto tipos se convierten a tipos más largos (
float
a double
, short
a int
, etc.)
- tipos de enteros se convierten a los tipos de punto flotante
- firmados/unsigned las conversiones favorecen evitar la pérdida de datos (si se firma se convierte a sin firmar o viceversa dependiendo del tamaño de los tipos respectivos)
Si el código como x > y
(donde x
y y
tienen tipos diferentes) es correcto o incorrecto depende de los valores que x
y y
pueden tomar. En mi experiencia, es una práctica común prohibir (a través del estándar de codificación) las conversiones de tipo implícito. El programador debe considerar el contexto y realizar explícitamente cualquier conversión de tipo necesaria.
Gracias, entonces eso significa que si f = 1.0162 sería int f == 1, entonces solo tendría que escalarlo, f * = 1000; tan int f == 1016 para mantener la precisión? – sevenboarder
No puede representar todos los enteros exactamente como flotar. No con la mantisa de 24 bits de float. Si fuera el doble, sí, pero no flotar :) – Joey
@Johannes, tienes razón, recuerdo mal una pregunta que respondí recientemente, actualicé para corregirla. – paxdiablo