Para desenvolvermos softwares sabemos que vamos lidar diversos tipos de dados, como: nomes, idades e preços. Sendo assim, uma linguagem de programação deve fornecer meios de armazenarmos essas informações na memória. Devido a isto, uma linguagem de programação nos fornece as chamadas variáveis, ou seja, meios para armazenarmos esses dados na memória.

Antes de começarmos a compreender os tipos de variáveis que temos em C++, é importante saber que podemos fazer esse armazenamento em 2 locais, Stack ou Heap.

Stack (Pilha)

“A pilha de funções (stack) é uma área da memória que aloca dados/variáveis  ou ponteiros quando uma função é chamada e desalocada quando a função termina. Podemos dizer então que representa a memória local àquela função. ” (Pantuza, 2017)

Desta forma, podemos concluir que se trata de uma memória reduzida e com escopo local.

Heap (Monte)

“O Heap, ou área de alocação dinâmica, é um espaço reservado para variáveis e dados criados durante a execução do programa (runtime). Vamos dizer que o Heap é a memória global do programa.” (Pantuza, 2017)

Desta vez, analisamos que estamos tratando de um escopo global, podendo assim utilizar a memória principal, obtendo mais do que o fornecido inicialmente para o programa.

Tipos de Variáveis

Dito isto, podemos agora falar dos Datatypes primitivos e consequentemente de quanta memória eles ocupam. Primeiro vamos imaginar um conjunto de números inteiros, se eu tentar colocar o número racional 1,5 nele, matematicamente, irei conseguir? Não, pois o número 1,5 não faz parte do conjunto dos inteiros (1,2,3,4,…,n).

Então podemos imaginar a variável desta forma, onde cada tipo de variável pertence à um conjunto que se caracteriza por um tipo.

Temos assim os seguintes tipos fundamentais (Cplusplus, 2019):

  • Character Types: podem armazenar um simples caractere como ‘C’ ou ‘&’. O tipo mais básico é o char, que é capaz de armazenar 1 byte (8 bits)
  • Numerical Integer Types: Podem armazenar números como 8 ou 1028. Existem em tamanhos variados
  • Floating-Point Types: armazenam os valores reais, como 0.14 ou 00.2
  • Boolean Types: pode representar 2 estados true(1) ou false(0)

Abaixo pode-se visualizar o tipo de dado, quantos bytes estes ocupam na memória e seu alcance

Tabela 1 – Tipos de Variáveis

Fonte: https://www.geeksforgeeks.org/c-data-types/

Certo, já temos os tipos de variáveis e seu alcance (range – Tabela 1), mas de onde esses números de alcance surgiram? Como eu sei que o tipo de dado int pode armazenar entre os números -2.147.483.648 até 2.147.483.647? Simples, esses bytes que são fornecidos (ex: para int, são 4 bytes) estão diretamente ligados com quanto cada tipo de dado pode armazenar. Vamos aos cálculos para entender melhor!

Sabemos que 1 byte equivale a 8 bits e que o tipo int comporta 4 bytes, ou seja, 32 bits (8×4). Logo o tipo inteiro pode armazenar até 32 bits. Um desses bits é utilizado para armazenar o sinal (positivo ou negativo), assim sobram 31 bits para números.

Sabemos que 1 bit pode comportar valores 0 ou 1 (binário), nos deixando com apenas 2 possíveis valores.. Logo se fizermos a conversão para decimal temos:

2^31 = 2.147.283.648

Com o bit reservado para valor temos: -2.147.283.648 até +2.147.283.647. Porque até +~647 e não até +~648? Porque no meio dessa imensidão de números ainda temos que reservar o espaço para o número 0.

Mas e se eu não quiser os números negativos ainda assim terei que disponibilizar todo esses espaço? Não, podemos retirar o bit do sinal utilizando a palavra unsigned antes do tipo da variável.

Ex:

Unsigned int var = 8;

Agora tenho 32 bits apenas para números positivos, aumentando consideravelmente o limite (+4.294.967.296).

Mas e os Caracteres? Você já deve ter ouvido falar da tabela ASCII, C/C++ a utiliza como forma de representar caracteres. Logo o número 65 se atribuído ao tipo char, irá resultar na letra A

Char a = 65;

printf(“DECIMAL %d: Caractere %c \t”, a, a);

Resultado: DECIMAL 65: Caractere A

Para finalizar tempos a variável booleana que aceita true(1) ou false(0). Podemos observar na Tabela 1 que este tipo utiliza 1 byte para armazenamento, mas se só preciso de 2 valores (0 ou 1), existe mesmo a necessidade de 1 byte (8 bits)? Bem, o que acontece é que não é permitido alocar na memória apenas 1 bit, sendo necessário disponibilizar, mesmo “sem necessidade”, 8 bits para armazenamento.

Terminamos este resumo por aqui, espero que tenha sido útil de alguma forma. Criticas construtivas são sempre bem vindas.

 

Fontes: