Tipo de dado

Em ciência da computação tipos de variáveis ou dados é uma combinação de valores e de operações que uma variável pode executar, o que pode variar conforme o sistema operacional e a linguagem de computador. São utilizados para indicar ao compilador ou interpretador as conversões necessárias para obter os valores em memória durante a construção do programa. Basicamente, servem para categorizar e separar todos os valores em classificações com base em seu valor, seja ele um texto, um número inteiro ou um número decimal. Alguns tipos de dados ocupam mais espaço na memória. Em C, por exemplo, um caractere ocupa um byte (oito bits) na memória. O tipo de dado ajuda também o programador a detectar eventuais erros envolvidos com semântica das instruções, erros esses detectados na análise semântica dos compiladores.
Dependendo da linguagem de programação, o tipo de um dado é verificado diferentemente, de acordo com a análise léxica, sintática e semântica do compilador ou interpretador da linguagem. Os tipos têm geralmente associações com valores na memória ou com objetos (para uma linguagem orientada a objeto) ou variáveis.
A verificação do tipo de um dado é feita de forma estática em tempo de compilação ou de forma dinâmica em tempo de execução. Em C, C++, Java e Haskell os tipos são estáticos, em Scheme, Lisp, Smalltalk, Perl, PHP, Visual Basic, Ruby e Python são dinâmicos.
Em C uma definição estática do tipo de uma variável ficaria assim:
Linguagens implementadas com tipificação forte (linguagem fortemente tipificada), tais como Java e Pascal, exigem que o tipo de dado de um valor seja do mesmo tipo da variável ao qual este valor será atribuído. Exemplo:
Ocorrerá um erro ao compilar a linha 7, pois o valor "17.1", que é do tipo REAL, precisa ser convertido para o tipo de dado INTEIRO.
Em linguagens com tipos de dados fracos, tais como PHP e VBScript, a conversão não se faz necessária, sendo realizada implicitamente pelo compilador ou interpretador.
Um tipo primitivo (também conhecido por nativo ou básico) é fornecido por uma linguagem de programação como um bloco de construção básico. Dependendo da implementação da linguagem, os tipos primitivos podem ou não possuir correspondência direta com objetos na memória.
Um tipo composto pode ser construído em uma linguagem de programação a partir de tipos primitivos e de outros tipos compostos, em um processo chamado composição.
Em C, cadeias de caracteres são tipos compostos, enquanto em dialetos modernos de Basic e em JavaScript esse tipo é nativo da linguagem.
Tipos primitivos típicos incluem caractere, inteiro (representa um subconjunto dos números inteiros, com largura dependente do sistema; pode possuir sinal ou não), ponto flutuante (representa o conjunto dos números racionais), booleano (lógica booleana, verdadeiro ou falso) e algum tipo de referência (como ponteiro ou handles).
Tipos primitivos mais sofisticados incluem tuplas, listas ligadas, números complexos, números racionais e tabela hash, presente sobretudo em linguagens funcionais.
Espera-se que operações envolvendo tipos primitivos sejam as construções mais rápidas da linguagem. Por exemplo, a adição de inteiros pode ser feita com somente uma instrução de máquina, e mesmo algumas CPUs oferecem instruções específicas para processar sequências de caracteres com uma única instrução. A maioria das linguagens não permite que o comportamento de um tipo nativo seja modificado por programas. Como exceção, Smalltalk permite que tipos nativos sejam estendidos, adicionando-se operações e também redefinindo operações nativas.
Uma estrutura em C e C++ é um tipo composto personalizável pelo programador de um conjunto determinado de campos e membros. Elas servem para criar um tipo de dado composto por campos que não podem ser modificados, removidos ou adicionados, pois são fixos. O tamanho total da estrutura para o tipo composto corresponde a soma dos requerimentos de cada campo da estrutura, além de um possível espaço para alinhamento de bits. Por exemplo:
define um tipo composto chamado Conta. A partir de uma variável minhaConta do tipo acima, pode-se acessar o número da conta através de minhaConta.numero. Em outras palavras, a variável minhaConta é uma instância da estrutura Conta, ou seja, usa a estrutura Conta como padrão, portanto, minhaConta possui o campo numero, nome, sobrenome e balanco. Cada instância da mesma estrutura não compartilhará os mesmos campos na memória, então modificar um campo de uma instância não modifica o campo correspondente de outra instância.