Tipos de dados
Em C, existem vários tipos de dados que podem ser usados para armazenar dados de naturezas diferentes. Os tipos de dados em C são os seguintes:
- char
- int
- float
- double
- void
char
usado para armazenar caracteres individuais, como letras e símbolos. Um tamanho de 4 bytes.
O tipo de dados char serve para armazenar um código ASCII decimal que representa um caractere, em vez do caractere em si. Quando fazemos char ch = ‘[‘ estamos, na realidade, a guardar na variável o valor inteiro 91 que é o código ASCII do caractere ‘[‘ (ver tabela ASCII nos anexos).
int
usado para armazenar números inteiros positivos e negativos. Tem um tamanho de 4 bytes.
float
usado para armazenar números de ponto flutuante de precisão simples. Tem um tamanho de 4 bytes.
double
usado para armazenar números de ponto flutuante de precisão dupla. Tem um tamanho de 8 bytes.
void
usado principalmente em funções que não retornam valores. O tipo de dado void não tem tamanho.
Modificadores de tipos de dados
A linguagem C possui modificadores de tipo que permitem modificar o tamanho e forma de representação de alguns tipos de dados.
Os modificadores de tipo são os seguintes:
- signed
- unsigned
- long
- short
signed
O modificador signed significa que o tipo de dados representa valores positivos e negativos. Este modificador pode ser omitido.
Exemplos:
signed int numero; //a variável numero pode ter valores positivos e negativos
int numero2: //a variável numero2 pode ter valores positivos e negativos
unsigned
O modificador unsigned significa que o tipo de dados representa valores positivo.
Exemplo:
unsigned int numero; //a variável numero só pode ter valores positivos.
short
O modificador short reduz o tamanho do tipo a que se aplica.
Exemplo:
int numero; //a variável numero tem 4 bytes de tamanho
short int numero2; //a variável numero2 tem 2 bytes de tamanho
long
O modificador long aumenta o tamanho do tipo a que se aplica.
Exemplo:
int numero; //a variável numero tem 4 bytes de tamanho
long int numero2; //a variável numero tem 2 bytes de tamanho
NOTA: o modificador aplica-se aos tipos de dados int e double mas não a float.
Em baixo uma tabela com um resumo dos tipos de dados em C:
| Tipo | Tamanho | Alcance | Formato |
| short int | 2 | -32,768 a 32,767 | %hd |
| unsigned short int | 2 | 0 a 65,535 | %hu |
| unsigned int | 4 | 0 a 4,294,967,295 | %u |
| int | 4 | -2,147,483,648 a 2,147,483,647 | %d |
| long int | 4 | -2,147,483,648 a 2,147,483,647 | %ld |
| unsigned long int | 4 | 0 to 4,294,967,295 | %lu |
| long long int | 8 | -(2^63) a (2^63)-1 | %lld |
| unsigned long long int | 8 | 0 a 18,446,744,073,709,551,615 | %llu |
| char | 1 | -128 a 127 | %c |
| unsigned char | 1 | 0 a 255 | %c |
| float | 4 | 1.2E-38 a 3.4E+38 | %f |
| double | 8 | 1.7E-308 a 1.7E+308 | %lf |
| long double | 16 | 3.4E-4932 a 1.1E+4932 | %Lf |
NOTA: nos sistemas 64 bit long int tem um tamanho de 8 bytes.
Em resumo, os tipos de dados em C são usados para armazenar dados de natureza diferente e podem ser modificados com modificadores de tipo para alterar seu tamanho e faixa de valores possíveis.
A função sizeof()
A função sizeof é uma função que permite determinar o tamanho em bytes de um tipo de dado, uma variável, ou um objeto em tempo de compilação. É uma parte fundamental da linguagem C e é frequentemente usado para alocar memória de forma dinâmica, manipular arrays, calcular tamanhos de estruturas e outros tipos de operações que envolvem o gerenciamento de memória.
A sintaxe geral do operador sizeof é a seguinte:
sizeof(tipo_de_dado);
tipo_de_dado: O tipo de dado ou a expressão para o qual você deseja obter o tamanho em bytes.
Exemplo:
struct Pessoa{
char nome[20];
int idade;
};
double nr;
int numeros[] = {7, 2, 9, 4};
struct Pessoa pessoa;
printf("%d\n", sizeof(nr)); //Output: 8
printf("%d\n", sizeof(numeros)); //Output: 16
printf("%d\n", sizeof(int)); //Output: 4
printf("%d\n", sizeof(pessoa)); //Output: 24
A instrução typedef
A instrução typedef é usada para criar sinónimos ou aliases para tipos de dados existentes. Isso permite que pode atribuir nomes mais legíveis e descritivos a tipos de dados, tornando o seu código mais claro e fácil de entender. A instrução typedef não cria um novo tipo de dado; em vez disso, ele cria um nome alternativo para um tipo existente.
A sua sintaxe é a seguinte:
typedef tipo_existente novo_nome;
Exemplo:
typedef int Inteiro; //criámos um alias para int
Inteiro numero = 42; //Declarámos uma variável com o alias
A instrução typedef é bastante usada para estruturas:
typedef struct {
char nome[50];
int idade;
} Pessoa;
Pessoa pessoa1;
pessoa1.idade = 30;
Conversões entre tipos de dados
As conversões de tipos de dados desempenham um papel crucial na linguagem de programação C, permitindo que você altere o tipo de dados de uma variável para atender às necessidades de um cálculo ou operação específica. No entanto, é importante efetuar essas conversões com cuidado, pois podem levar a perda de dados ou comportamento inesperado se não forem feitas corretamente.
Temos dois tipos de conversões de tipos de dados: as conversões implícitas e as conversões explicitas.
As conversões implícitas são conversões de um tipo de dado para outro com maior capacidade. Sendo assim, a conversão não traz riscos de perda de dados. Deste modo, o compilador faz esta conversão de forma automática:
int nr1 = 849;
double nr2;
nr2 = nr1; //conversão implícita
As conversões explicitas (casting) são conversões de um tipo de dados para outro com menor capacidade. Esta conversão pode implicar perda de dados pelo que deve ser feita por ordem explicita do programador:
int nr1;
double nr2 = 9.846484495;
nr1 = (int)nr2; //conversão explicita (casting)
Literais
Literais em C são valores constantes que aparecem diretamente no código-fonte
Eles são usados para representar valores fixos, como números inteiros, números de ponto flutuante, caracteres e strings
Os literais são usados para inicializar variáveis e constantes, bem como para passar valores para funções.
Existem vários tipos de literais em C, incluindo:
- Literais inteiros: são usados para representar valores inteiros, como 10, -5 e 0.
- Literais de ponto flutuante: são usados para representar valores de ponto flutuante, como 3.14 e -2.5.
- Literais de caractere: são usados para representar caracteres individuais, como ‘a’, ‘b’ e ‘1’.
- Literais de string: são usados para representar sequências de caracteres, como “hello” e “world”.
char ch = 'F';
int nr1 = 24;
float nr2 = 13.8F;
double nr3 = 37.65;
char nome[] = "Carlos";
De notar que :
Literais de caractere devem estar entre plicas (‘).
Um literal de String deve estar entre aspas.
Literais de double devem ser numeros com parte decimal.
Um literal de float deve ser um numero com parte decimal e o sufixo f no fim.
Literais inteiros devem ser numeros inteiros.
