<Direto ao Ponto 41> Os tipos de dados primitivos
- #Informática Básica
Artigos desta série: ( < ) Anterior | Índice | Seguinte ( > )
Olá, dev!
Este é mais um artigo da série DIRETO AO PONTO, que eu estou escrevendo para a DIO. Ele vai tratar os tipos primitivos de dados oferecidos pelas linguagens de programação.
Sumário
1. Introdução
2. Um programa de computador
3. Os tipos primitivos de dados
4. Considerações finais
5. Referências
1 – Introdução
Eu criei a série de artigos DIRETO AO PONTO com o objetivo de apresentar, de forma simples e direta, conhecimentos básicos da programação e de computação, principalmente, para os iniciantes.
Aqui, são tratados de temas como lógica de programação, linguagens, hardware dos computadores, história da computação e assuntos relacionados à plataforma da DIO, como a escrita de artigos e os desafios de código.
Neste artigo, eu vou falar sobre os tipos primitivos de dados oferecidos pelas linguagens de programação.
Um programa de computador é feito de variáveis, que representam os diversos dados usados no algoritmo, e comandos, que manipulam estes dados e determinam o fluxo das operações executadas.
Muitas vezes, a escolha dos tipos de dados interfere diretamente no desempenho e na precisão do programa escrito. E esta escolha depende muito do tipo da aplicação do programa, que são inúmeras.
Cada linguagem de programação procura oferecer vários tipos de dados, adequados aos diversos tipos de aplicações que podem ser criadas para resolver problemas.
Existem inúmeros tipos de estruturas de dados complexas que podem se adaptar a determinadas aplicações, mas por baixo delas sempre existem outras estruturas bem mais simples, que são a base do processamento básico de um programa de computador. São os tipos de dados primitivos (ou nativos), assunto que será tratado neste artigo.
2 – Um programa de computador
Um programa de computador é escrito em alguma linguagem de programação, que implementa as ações de determinado algoritmo elaborado para resolver um determinado problema.
Existem inúmeras linguagens de programação, cada uma delas dependente do contexto histórico em que foram criadas, com a tecnologia existente na época. Além disso, o projeto de cada uma é voltado para a resolução de uma determinada classe de problemas e isso também interfere nas estruturas oferecidas por ela.
Por exemplo, a linguagem C foi criada como uma linguagem de baixo nível, pensada para manter controle direto do hardware dos equipamentos em que ela é executada, e seguindo o paradigma estruturado (procedural).
Por isso, a linguagem C é muito usada em aplicações de sistemas embarcados, IOT e sistemas de baixo nível (como sistemas operacionais, servidores e compiladores).
Já a linguagem Java foi criada para ter uma base forte na orientação a objetos, e usa uma sintaxe muito robusta, complexa e verbosa (na minha opinião), onde tudo é objeto e tem que ser tratado formalmente assim.
No início, Java era muito usada na web (em applets), depois em aplicações de uso geral, para desktop, depois para mobile (até o Google recomendar a preferência por Kotlin em lugar de Java).
Já Python foi criada com o objetivo de ter uma sintaxe simples e de fácil aprendizado, sendo voltada para aplicações gerais (desktop e web), sendo menos usada em alguns tipos de aplicações (mobile, por exemplo).
Por suas características de fácil manipulação de dados multidimensionais (com Numpy), a linguagem se mostrou a mais adequada (e mais usada) na área de “Big Data”, Dados e IA.
Os tipos de dados primitivos oferecidos por cada linguagem refletem as suas características ed as aplicações para as quais elas são mais adequadas.
3 – Os tipos primitivos de dados
Como já foi dito, os tipos de dados primitivos são fornecidos pelas linguagens para o armazenamento de dados básicos, sem nenhuma estrutura complexa.
Os principais tipo de dados primitivos são:
· Inteiro – para armazenar números inteiros;
· Real – para armazenar números reais, com parte decimal;
· Lógico – também chamado de booleano, é usado para armazenar os valores lógicos Verdadeiro (V) e Falso (F);
· Caractere – para símbolos armazenar 1 valor alfanuméricos, de pontuação ou outros caracteres imprimíveis.
· String – para armazenar uma sequência (cadeia) de caracteres;
· Complexo – para armazenar números complexos (imaginários) da matemática.
Cada linguagem oferece um ou mais tipos dos listados acima e implementa cada um de uma forma específica.
Em geral, as linguagens fortemente tipadas (Java, Javascript, C, C++, C#, Pascal e Fortran) exigem que as variáveis tenham seus tipos declarados explicitamente, enquanto as fracamente tipadas (Python, Javascript, PHP) definem seus tipos automaticamente, de acordo com o dado atribuído à variável
Agora, vamos detalhar o que cada um destes tipos oferece:
INTEIRO – Usado para armazenar números inteiros (positivos, negativos ou zero), sem casa decimal, como dados de idades, quantidades, contadores de iterações, por exemplo:
· Idade = 25;
· Quantidade = 9;
· Diferença = -5 ;
· i = 0.
Os tipos mais usados são int (Java, C, C++, C#), Int (Kotlin) e integer (Pascal, Fortran).
As linguagens C e C++ ainda oferecem modificadores que alteram alguns tipos de dados, por exemplo:
· Short – reduz o tamanho (em bytes) reservado para armazenar o dado;
· Long – aumenta o tamanho (em bytes) reservado para armazenar o dado;
· Unsigned – só permite o armazenamento de dado sem representação de sinal, números só positivos;
· Signed – é o contrário de unsigned, permite o armazenamento de dado com sinal, ou seja, números negativos;
· Register – recomendava ao compilador que armazenasse aquele dado em um registrador da CPU ao invés da memória. Usado para aumentar a velocidade de execução de variáveis contadoras em loops, por exemplo. Os compiladores atuais já otimizam o código quando necessário e este modificador deixou de ter validade, sendo até desencorajado o seu uso.
Eles são aplicados aos tipos int, char e até double (long double).
A linguagem C# oferece algumas variações dos tipos primitivos (byte, short, int e long) que têm o mesmo efeito destes modificadores da linguagem C. Os tipos que se iniciam por u são sem sinal (unsigned) e por s são com sinal (signed).
O Javascript possui o tipo number, que vale tanto para números inteiros quanto para reais (sempre de dupla precisão) e o tipo bigint, para inteiros grandes.
Os tipos para Java (byte, short,int e long) são os mesmos da linguagem Kotlin (Byte, Short, Int e Long), só que em Kotlin eles são derivados de uma classe, oferecendo alguns métodos.
A seguir, é mostrada uma tabela comparativa com os tamanhos (em bytes) ocupados por variáveis de cada um dos diversos tipos de inteiros, para C. C++, C#, Java e Kotlin.
(*) OBS – os tipos long e unsigned long, das linguagens C e C++, têm tamanho de 4 bytes (32 bits), para arquiteturas de 32 bits, e de 8 bytes (64 bits), para arquiteturas de 64 bits.
REAL – Usado para armazenar números COM casas decimais. Usa-se para armazenar dados de altura, peso, distâncias, temperatura, porcentagens, dinheiro, por exemplo.
Lembrando sempre que os códigos exigem que o separador de decimal seja o ponto ao invés da vírgula, tradicional na notação matemática brasileira. Veja alguns exemplos:
· altura = 1.85;
· peso = 87.2;
· distancia = 135.47;
· temperatura = -7.8;
· aumento = 12.75;
· custo = 123.45.
Os tipos mais comuns para armazenar números reais são float (Java, C, C++, C#, PHP), Float (Kotlin), double - com precisão maior (Java, C, C++, C#), Double (Kotlin) e real (Pascal, Fortran).
Em C, ainda pode ser usado um modificador para o tipo double: long double, aplicado a números reais.
Algumas linguagens ainda apresentam um tipo de dado chamado void, que indica que uma função ou método não retorna nenhum valor.
LÓGICO – Usado para armazenar resultados de operações lógicas, como verdadeiro ou falso. Cada linguagem oferece uma implementação específica para representar cada tipo, por exemplo, True (Python), true (Java), 1 (C), etc. Exemplos:
· tecla_apertada = True
· numeroPar = true
· FIMJOGO = .TRUE.
· existeItem = 1
· final = False
· eh_impar = false
· mouseMove = 0
· pilhaVazia = .false.
Os tipos comuns são:
· bool (Python,C, C++, C#, PHP);
· boolean (Java, Javascript, Pascal, Fortran);
· Boolean (Kotlin);
· logical (Fortran).
E os valores permitidos para as variáveis são:
· True, False (Python);
· true, false (C, C#, Java, Kotlin, Javascript, PHP, Pascal);
· .true., .false. (Fortran).
O tipo bool da linguagem C só foi introduzido na versão C99, não existindo anteriormente, pois era considerado o valor inteiro 0 como false e qualquer outro valor inteiro como true.
CARACTERE – Usado para armazenar caracteres alfanuméricos, sinais de pontuação e outros símbolos. Algumas linguagens permitem armazenar sequências de caracteres. Por exemplo:
· char letra = ‘A’ (linguagem C);
· char símbolo = ‘$’ (linguagem C).
· letra = ‘b’ (Python);
· símbolo = “@’”(Python);
Em C, deve-se atribuir o valor de um único caractere a uma variável do tipo char usando apóstrofos, que armazena o código ASCII dele. Se forem usadas aspas, o compilador entenderá que o valor é uma cadeia de caracteres (string), sempre finalizado com o caractere ‘\0’, cujo comportamento é totalmente diferente de um só caractere.
Os tipos mais comuns são:
· char (C, C++, C#, Java, Pascal)
· Char (Kotlin);
· string (Javascript, PHP);
· str (Python – strings não são considerados um tipo primitivo em Python, mas em alguns contextos, eles são tratados assim
· character (Fortran);
STRING – Usado para armazenar sequências (cadeias) de caracteres alfanuméricos, sinais de pontuação e outros símbolos. Algumas linguagens usam o mesmo tipo para armazenar caracteres individuais e cadeias de caracteres. Por exemplo:
· char nome[ ] = “João” (na linguagem C);
· std::string nome = "João" (em C++);
· string nome = "João" (em C#)
· String nome = "João" (em Java);
· nome: String = "João" (em Kotlin).
· nome = ‘Fernando’ (em Python);
· nome = “Araujo” (Python).
Os tipos mais comuns para representar strings são:
· char [ ] (C, C++)
· string (C++, C#, PHP, Javascript
· String (Java, Kotlin)
· str (Python)
· character (Fortran)
A linguagem C não possui um tipo de dado nativo chamado string como nas linguagens de alto nível, mas eles podem ser representados por meio de vetores (”arrays”) de caracteres (char).
Em C++, esta forma de manipular strings também pode ser usada, mas ele oferece um tipo string em uma de suas bibliotecas (std::string).
Em Python, strings não são considerados um tipo primitivo, mas em alguns contextos da linguagem, elas são tratadas como tal. Além disso, não existe diferença entre usar aspas ou apóstrofos para atribuir um string a uma variável do tipo char ou str.
Em C, deve-se atribuir o valor de um único caractere a uma variável do tipo string usando aspas, pois nesta linguagem uma cadeia de caracteres sempre é finalizada com o caractere ‘\0’, cujo comportamento é diferente de um caractere único.
Em Java e Kotlin, há o tipo String, mas não é um tipo primitivo, pois ele faz parte da classe String, que oferece vários métodos de manipulação de strings.
COMPLEXO – Usado para armazenar números complexos, definidos na matemática como tendo o formato a + b*i, onde a é a parte real e b*i é a parte imaginária, i representa o valor raiz de -1 ( ).
Poucas linguagens oferecem este tipo primitivo (eu conheço Python e Fortran, esta desde as suas primeiras versões), embora algumas permitam trabalhar com números complexos usando bibliotecas matemáticas específicas (Javascript, Java, Kotlin, C, C++ e C#). Por exemplo:
· num = 3 + 4j (Python - atribuição)
· num complex :: numeroComplexo (Fortran - declaração)
· num = (3.0, 4.0) – Fortran – atribuição. Representa o número 3.0 + 4.0*i
Os tipos usados em Python e Fortran é complex. Em Python, o i imaginário é trocado por j, como em algumas publicações matemáticas
4 – Considerações finais
Este é mais um artigo da série DIRETO AO PONTO, que eu estou escrevendo para a DIO. Desta vez, eu falei sobre os tipos primitivos de dados oferecidos pelas linguagens de programação.
As linguagens são projetadas para serem usadas em vários tipos de aplicações, mas algumas são criadas com o objetivo de resolver problemas específicos, como o Fortran, que foi criado para a solução de problemas científicos, ou Kotlin, que foi criada para ser um subconjunto mais simplificado de Java, acrescida de algumas caraterística mais modernas.
O tipo de aplicação para a qual uma linguagem foi criada determina que tipos de dados serão mais usadas e, assim, quais os tipos de dados elas oferecem nativamente.
Todas as linguagens oferecem os tipos básicos para tratar de inúmeros inteiros, reais, dados lógicos e caracteres.
Todas também oferecem meios de se representar e manipular com dados de sequências de caracteres, algumas de forma primitiva, como C# Javascript e Python, outras, por meio de classes de objetos String ou por bibliotecas específicas.
Além disso, algumas linguagens (Python e Fortran) oferecem tipos de dados primitivos para armazenar números complexos.
No próximo artigo, eu vou começar a falar sobre os blocos de comandos múltiplos.
5 – Referências
Todo o conteúdo deste artigo foi tirado do que eu aprendi (e me lembro) sobre o assunto desde o início da minha carreira como programador, desde os anos 80 até agora. Por isso, não vou listar nenhum a referência de livros nem de sites.
No entanto, para a elaboração das tabelas com os detalhes dos tipos de dados oferecidos pelas diversas linguagens de programação que eu já usei, eu consultei as ferramentas ChatGPT e Copilot.
Artigos desta série: ( < ) Anterior | Índice | Seguinte ( > )