Username: Password:

.Valores em C (nível 2)

Conversões explicitas

Em algumas ocasiões, pode ser necessário converter um valor de um tipo para outro. O mecanismo usado em C consiste em preceder uma expressão do tipo para o qual queremos a converter, entre parêntesis. Por exemplo :

double pi = 3.141592653589793;
float pif = (float) pi;
int tres = (int) pi;
Na primeira linha um valor (de tipo double) é atribuido à variável pi. Na segunda linha o mesmo valor é convertido para o tipo float antes de ser atribuido à variável pif. Finalmente, na terceira linha o valor de pi, convertido num inteiro é atribuido à variável tres. Neste caso a conversão consiste em guardar apenas a parte inteira do valor (3).

Note que no exemplo anterior as conversões explicitas não eram necessárias dado que numa atribuição, o C converte automaticamente os valores para o tipo da variável à qual é atribuido (ver esta secção). Qual é então a utilidade das conversões explicitas ?

O caso da função printf

Numa chamada à função printf, não há conversões automáticas. Se desejar imprimir um valor inteiro como se fosse um valor decimal (com .00000 no fim) deve colocar uma conversão explicita para float (ou double), da mesma forma, se quiser imprimir um valor decimal sem as casas decimais, é necessário converter explicitamente o valor. Por exemplo o programa :

#include <stdio.h>
int main (void) {
   double pi = 3.141592653589793;
   int custo = 32;
   printf("O valor de pi é %d o custo é : %f\n", (int) pi, (double) custo);
   return 0;
}
produzirá no ecrã :
O valor de pi é 3 o custo é : 32.000000

É um caso onde a conversão explicita é obrigatória. Se escrever :

printf("O valor de pi é %d o custo é : %f\n", pi, custo);
O compilador se for usado com as opções -ansi e -Wall produzirá dois menssagens de tipo «aviso» :
> gcc -ansi -Wall test.c -o test
test.c: In function ‘main’:
test.c:5: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’
test.c:5: warning: format ‘%f’ expects type ‘double’, but argument 3 has type ‘int’

Intervalos para valores inteiros e decimais

As gamas de valores que podem ser usadas com os tipos int, float e double podem variar de um computador para outro. Para poder escrever programas que tomam em conta essas caracteristicas, pode usar um conjunto de constantes definidas no ficheiro values.h da biblioteca do C. O programa seguinte explicita e mostra os valores dessas constantes.

#include <stdio.h>
#include <values.h> 

int main (void) {
  printf("O menor inteiro é : %d\n", MININT);
  printf("O maior inteiro é : %d\n", MAXINT);
  printf("O menor float (positivo) é : %g\n", MINFLOAT);
  printf("O maior float (positivo) é : %g\n", MAXFLOAT);
  printf("O menor double (positivo) é : %g\n", MINDOUBLE);
  printf("O maior double (positivo) é : %g\n", MAXDOUBLE);
  return 0;
}
> ./testvalores
O menor inteiro é : -2147483648
O maior inteiro é : 2147483647
O menor float (positivo) é : 1.17549e-38
O maior float (positivo) é : 3.40282e+38
O menor double (positivo) é : 2.22507e-308
O maior double (positivo) é : 1.79769e+308