C é uma linguagem tipada de forma estática e explícita. Isso significa que todo dado manipulado no programa precisa ter seu tipo definido, e esse tipo determina como ele será representado na memória, qual seu tamanho, alinhamento e o conjunto de operações válidas.
Tipos de dados primitivos
Os principais tipos em C são divididos em categorias:
Tipo
Tamanho típico (32-bit)
Descrição
char
1 byte
Caracteres ou pequenos inteiros
int
4 bytes
Inteiros padrão
short
2 bytes
Inteiros menores
long
4 ou 8 bytes
Inteiros maiores
float
4 bytes
Números de ponto flutuante (simples)
double
8 bytes
Ponto flutuante com mais precisão
O tamanho dos tipos depende da arquitetura e do compilador. No Linux, use sizeof() ou echo | gcc -dM -E - < /dev/null para ver definições.
Sinalização
Tipos inteiros podem ser:
signed (default): permitem valores negativos e positivos
unsigned: apenas valores positivos (e zero), com o dobro de alcance positivo
unsignedint u =4294967295;// Máximo de 32 bits sem sinal int s =-2147483648;// Mínimo de 32 bits com sinal
Saber isso é fundamental para interpretar corretamente valores em buffers, estruturas e regiões de memória, especialmente em engenharia reversa.
Variáveis: alocação e escopo
Declarações como:
instruem o compilador a reservar espaço na stack (em tempo de execução) ou em seções específicas do binário (caso sejam globais ou estáticas).
Locais: vão para a stack e são desalocadas ao sair do escopo.
Globais/estáticas: vão para as seções .data (inicializadas) ou .bss (não inicializadas).
Constantes literais: vão geralmente para .rodata.
Operadores
C fornece um conjunto completo de operadores para manipular dados diretamente:
Aritméticos
Relacionais
Lógicos
Bit a bit
Esses últimos são especialmente importantes em contextos de:
Manipulação de registradores,
Controle de flags,
Interpretação de protocolos binários,
Criptografia e codificações de baixo nível.
Exemplo de uso real:
Conversão de tipos (type casting)
Em C, é possível forçar a conversão de tipos manualmente:
Mas cuidado: conversões implícitas (promotions) também ocorrem em expressões mistas, podendo causar comportamento indefinido, overflow ou truncamento, algo crítico ao manipular dados recebidos da rede, arquivos ou memória.