Sie sind auf Seite 1von 3

Marcela de Jess Refugio Garca

Operaciones con expresiones de

significativos.

distintos tipos.

Si el valor de b es, por ejemplo, 20.5, a

En una expresin en C pueden aparecer


componentes de diferentes tipos. Durante la
evaluacin de una expresin donde sus
subexpresiones sean de tipos diferentes, deber
tener lugar una conversin, ya sea implcita o
explcita, para llevar ambos operandos a un
tipo de datos comn con el que se pueda
operar. La forma en que el compilador resuelve
las conversiones implcitas a veces provoca
algunas sorpresas.

Truncamiento en asignaciones.
Para empezar, una asignacin de una expresin
de un tipo dado a una variable de un tipo
menor no slo es permitida en C sino que la
conversin se hace en forma automtica y
generalmente sin ningn mensaje de tiempo de
compilacin ni de ejecucin.
Por ejemplo;
int a; float b;... a=b;
En esta asignacin tenemos miembros de
diferentes tamaos. El resultado en a ser el
truncamiento del valor entero de b a la
cantidad de bits que permita un int. Es decir, se
tomar la parte entera de b y de esa expresin
se copiarn en el objeto de datos de a tantos bits
como quepan en un int, tomndose los menos

terminar valiendo 20, lo que es similar a


aplicar una funcin "parte entera"
implcitamente, y no demasiado incongruente.
Pero si la parte entera de b excede el rango de
un entero (por ejemplo si b=99232.5 con
enteros de 16 bits), el resultado en a no tendr
lgica aparente. En el primer caso, los bits
menos significativos de b que "caben" en a
conservan el valor de b; en el segundo caso, no.
En la sentencia:
a=19.27 * b;
a contendr los sizeof (int) bits menos
significativos del resultado de evaluar la
expresin de la derecha, truncada sin
decimales.

Promocin automtica de expresiones


Por otra parte, se tienen las reglas de
promocin automtica de expresiones.
Enunciadas en forma aproximada (ms
adelante las damos con precisin), estas reglas
dicen que el compilador har estrictamente las
conversiones necesarias para llevar todos los
operandos al tipo del mayor. El resultado de
evaluar una operacin aritmtica ser del tipo
del mayor de sus operandos, en el sentido del
tamao en bits de cada objeto de datos. A veces
esto no es lo deseado. Por ejemplo, dada la

sentencia: a=3/2; se tiene que tanto la constante

Son aplicadas por el compilador en el orden

3 como la constante 2 son vistas por el

que se da ms abajo (tomado de K&R, 2a. ed.).

compilador como ints; el resultado de la

Esta es una lista muy detallada de las

divisin ser tambin un entero (la parte entera

comprobaciones y conversiones que tienen

de 3/2, o sea 1).

lugar; para la mayora de los propsitos

An ms llamativo es el hecho de que si

prcticos basta tener en cuenta la regla de

declaramos previamente: float a; el resultado es

llevar ambos operandos al tipo del mayor de

casi el mismo: a terminar conteniendo el valor

ellos. Entendemos por "promocin entera" el

float 1.0, porque el problema de truncamiento

acto de llevar los objetos de tipo char, enum y

se produce ya en la evaluacin del miembro

campos de bits a int; o, si los bits de un int no

derecho de la asignacin. Cmo recuperar el

alcanzan a representarlo, a unsigned int.

valor correcto, con decimales, de la divisin?


Declarar a como float es necesario pero no

1. Si cualquier operando es long double, se

suficiente. Para que la expresin del miembro

convierte el otro a long double

derecho sea float es necesario que al menos uno

2. Si no, si cualquier operando es double, se

de sus operandos sea float. Hay dos formas de

convierte el otro a double

lograr esto; la primera es escribir cualquiera de

3. Si no, si cualquier operando es float, se

las constantes como constante en punto flotante

convierte el otro a float

(con punto decimal, o en notacin

4. Si no, se realiza promocin entera sobre

exponencial): a=3. /2;

ambos operandos.

Operador cast

5. Si cualquiera de ellos es unsigned long int, se

La segunda consiste en forzar explcitamente

convierte el otro a unsigned long int.

una conversin de tipo, con un importante

6. Si un operando es long int y el otro es

operador llamado cast, as: a= (float)3/2; Da lo

unsigned int, el efecto depende de si un long int

mismo aplicar el operador cast a cualquiera de

puede representar a todos los valores de un

las constantes. Sin embargo, lo siguiente no es

unsigned int.

til: a= (float) (3/2); Aqu el operador cast se

7. Si es as, el unsigned int es convertido a long

aplicar a la expresin ya evaluada como

int.

entero, con lo que volvemos a tener un 1.0 float

8. Si no, ambos se convierten a unsigned long

en a.

int.

Reglas de promocin en expresiones

9. Si no, si cualquier operando es long int, se

convierte el otro a long int.

sufijo U en las mismas situaciones, asignacin

10. Si no, si cualquier operando es unsigned

o en cualquier expresin donde aparezcan.

int, se convierte el otro a unsigned int. 1

Ejemplo:

1. Si no, ambos operandos son int.

unsigned x = 10008000U;

Notacin en constantes en lenguaje C.

Constantes unsigned long y unsigned long

Constantes int.

long.

Para las constantes int basta con darle el valor a

Tambin podemos combinar las constantes

la variable sin necesidad de hacer un sufijo,

unsigned y long, esto para trabajar con datos

esto se debe a que es la constante standar y el

realmente grandes aplicados en programas

compilador puede trabajar sin problemas de

como la Serie Fibonacci o algn programa que

conversiones.

use recursividad. Para el caso de unsigned long

Constantes long.

usamos el sufijo UL y ULL para unsigned

Cuando introduzcamos los valores constantes

long long.

long debemos usar el sufijo L, sobre todo

Ejemplo:

cuando esas constantes aparezcan en

unsigned long x = 15263UL;

expresiones condicionales y por coherencia,

unsigned long long y = 145632ULL;

tambin en expresiones de asignacin.

Constantes float.

Ejemplo:

El sufijo que se utiliza en esta constante es f.


long x=123L;

Ejemplo:
float x = 425.33f;

if(0L == x ) imprimir(valor nulo);

Constantes long long.

Constantes double.

En caso de estos valores debemos usar el sufijo

Por defecto, si no se usa el sufijo el compilador

LL tanto cuando aparezcan en expresiones de

tratara a las constantes con precisin doble, es

condicionales as como en expresiones de

decir, double.

asignacin.

Ejemplo:
double x = 0.05;

Ejemplo:
long long x=158964256323LL;

Constantes long double.

if(1LL == x ) imprimir(valor nulo);

En estas constantes se usara el sufijo L ya que

Constantes unsigned.

se trata de constantes de precisin mxima, es

Del mismo modo cuando introduzcamos

decir, long double.

constantes de tipo unsigned debemos usar el

Das könnte Ihnen auch gefallen