Programar em C/Mais sobre variáveis: diferenças entre revisões

[edição verificada][edição verificada]
Conteúdo apagado Conteúdo adicionado
Abacaxi (discussão | contribs)
Sem resumo de edição
Abacaxi (discussão | contribs)
Linha 102:
 
== Conversão de tipos ==
As atribuições no C tem o seguinte formato:
destino=origem;
 
Se o destino e a origem são de tipos diferentes o compilador faz uma conversão entre os tipos. Mas nem todas as conversões são possíveis. O primeiro ponto a ser ressaltado é que o valor de origem é convertido para o valor de destino antes de ser atribuído e não o contrário.
=== Casting: conversão manual ===
 
Em C, cada tipo básico ocupa uma determinada porção de bits na memória, logo, a conversão entre tipos nem sempre é algo nativo da linguagem, por exemplo:assim dizer. Há funções como atol e atof que convertem string em inteiro longo (long int) e string em double, respectivamente. Mas em muitos casos é possível usar o casting.
 
É importante lembrar que quando convertemos um tipo numérico para outro, nós nunca ganhamos precisão. Nós podemos perder precisão ou no máximo manter a precisão anterior. Isto pode ser entendido de uma outra forma. Quando convertemos um número não estamos introduzindo no sistema nenhuma informação adicional. Isto implica que nunca vamos ganhar precisão.
* '''char''' possui ''8 bits'', vai de '''-127 a 127'''
* '''int''' possui ''16 bits'', vai de '''-32.767 a 32.767'''
* '''short''' int possui ''8 bits'', vai de '''0 a 255'''
* '''float''' possui ''32 bits'' e '''seis dígitos de precisão'''
* '''double''' possui ''64 bits'' e '''dez dígitos de precisão'''
* '''long double''' possui ''128 bits'' e '''dez dígitos de precisão'''
 
Abaixo vemos uma tabela de conversões numéricas com perda de precisão, para um compilador com palavra de 16 bits:
Logo, a conversão entre tipos nem sempre é algo nativo da linguagem, por assim dizer.
Há funções como atol e atof que convertem string em inteiro longo (long int) e string em double, respectivamente.
 
De Para Informação Perdida
Mas em muitos casos é possível usar o casting.
unsigned char char Valores maiores que 127 são alterados
short int char Os 8 bits de mais alta ordem
int char Os 8 bits de mais alta ordem
long int char Os 24 bits de mais alta ordem
long int short int Os 16 bits de mais alta ordem
long int int Os 16 bits de mais alta ordem
float int Precisão - resultado arredondado
double float Precisão - resultado arredondado
long double double Precisão - resultado arredondado
 
=== Casting: conversão manual ===
 
Se declararmos '''a = 10/3''', sabemos que o resultado é '''3,333''', ou seja a divisão de dois números inteiros dá um número real. Porém o resultado em C será o inteiro 3. Isso acontece, porque as constantes são do tipo inteiro e operações com inteiros tem resultado inteiro. O mesmo ocorreria em '''a = b/c''' se b e c forem inteiros.
O casting é feito para "cortar" bits de tipos, podendo convertê-los a tipos de tamanho menor.
 
Se declararmos:
Vamos entender melhor tomando os seguintes tópicos:
i = ( int) fa;
* '''float''' possui 32 bits
O resultado será '''3'''.
* '''int''' possui 16 bits
 
Mesmo que declarássemos:
Mas qual a diferença de '''float''' pra '''int''' ?
float fa;
o resultado continua a ser 3 mas desta vez, '''3,0000'''.
 
Para fazer divisão que resulte número real, é necessário fazer cast para um tipo de ponto flutuante:
Um número '''float''': 43.023 ao ser convertido para '''int''' deverá ser "cortado", ficando inteiro: '''43'''
a = (float)10/3
a = 10/(float)3
Nesse caso, o 10 ou o 3 é convertido para float. O outro número continua como inteiro, mas ao entrar na divisão com um float, ele é convertido automaticamente para float. A divisão é feita e depois atribuída à variável a.
 
CastingEm poucas palavras, casting é colocar um tipo entre parênteses antes da atribuição de uma variável. A forma geral para cast é:
O que será feito é ignorar os bits extras, usados nos campos decimais.
(tipo)variável
(tipo)(expressão)
variavel_destino = (tipo) variavel_origem;
 
Mas existem umas conversões automáticas:
<pre>
<source lang="C">
<nowiki>
int i;f(void)
{
float f;
float f_var;
f = 43.023;
double d_var;
/* A conversão com casting é: */
long double l_d_var;
i = (int) f;
f_var = 1; d_var = 1; l_d_var = 1;
</nowiki>
d_var = d_var + f_var; /*o float é convertido em double*/
</pre>
l_d_var = d_var + f_var; /*o float e o double convertidos em long double*/
return l_d_var;
}
</source>
 
Repare que a conversão é feita de menor para o maior.
Em poucas palavras:
Casting é colocar um tipo entre parênteses antes da atribuição de uma variável.
 
É possível fazer a conversão ao contrário de um tipo com mais bits para um com menos bits e isso é truncar. Nesse caso, o cast explícito é necessário. Assim, um número '''float''': 43.023 ao ser convertido para '''int''' deverá ser "cortado", ficando inteiro: '''43'''. Se converter long para short, os bits mais significativos são perdidos na conversão.
<pre>
<nowiki>
variavel_destino = (tipo) variavel_origem;
</nowiki>
</pre>
 
IssoO operador cast também podee serbastante utilizado compara ponteiros eestruturar estruturasáreas de dados,estoque mastemporários lembre-se:(buffer).
A seguir um pequeno exemplo:
 
<source lang="C">
O casting fala ao compilador pra utilizar o tipo entre parênteses como "forma" para cortar bits do dado antes de atribuí-lo à variável.
#include <stdio.h>
typedef struct estruturar{
char a ;
char b ;
};
int main()
{
char buffer[2] = {17, 4};
estruturar *p;
p = (struct estruturar*) &buffer;
char* x = (char*)malloc(10);
printf("a: %i b: %i", p->a,p->b);
getchar();
return 0;
}
</source>
 
== Atributos das variáveis ==