Java com café: Tipos Primitivos - Java

Tipos Primitivos - Java

Hoje vou falar sobre tipos primitivos em Java. Veremos uma breve introdução sobre variáveis e em seguida detalhes sobre cada tipo.

Variáveis

Variáveis são espaços na memória onde podemos guardar informações. Provavelmente todos programas que você escrever vão usar variáveis, seja para guardar um nome, o caminho de uma pasta, etc. Também, como o próprio nome diz, elas podem variar, ter seu valor modificado durante a execução do programa.
Variáveis são nada mais que depósitos de bits. Cada valor é convertido para binário e então pode ser colocado na memória. Usamos o nome da variável para acesar o valor. O nome da variável é apenas o endereço para acessar o valor atribuído a ela.
As variáveis possuem tipos diferentes, dependendo da informação a ser armazenada. Por exemplo: Podemos ter um depósito tipo short que nos dará um espaço para guardar qualquer valor que convertido em binário possua 16 bits (65535 valores possíveis).
Em Java temos os seguintes tipos primitivos:
Tipo      Bits      Bytes
___________________________
byte     8         1
short    16        2
int      32        4
long     64        8
float    32        4
double   64        8
char     16        2
boolean  -         -

Eles são chamados de tipos primitivos porque são tipos já pre definidos pela linguagem e seus nomes são palavras reservadas. Eles não são como os objetos. Objetos são um tipo de dado criado pelo usuário que possuem um estado e tem métodos. Primitivos não possuem estados nem métodos. Objetos podem mudar de tipo, mas os primitivos não. Uma vez declarado o tipo, assim ele será e somente o valor poderá mudar.
Os primitivos apenas determinam o tipo e o tamanho da informação a ser guardado. Vou fazer um breve comentário sobre os tipos primitivos disponíveis em Java:
  • byte: O byte aceita até 256 valores. Eles podem estar compreendidos entre -128 <= x <= 127. Porque alguém usaria um tipo desses? Poderia usar para salvar bytes num grande vetor, como uma memória virtual.
  • short: O tipo short suporta valores entre -32,768 <= x <= 32,767. Ele possui o dobro de tamanho do byte e sua aplicação poderia ser a mesma. Não se preocupe em decorar esses intervalos. Apenas o intervalo do tipo byte é bom saber mas os outros saiba apenas o número de bits de acordo com a tabela.
  • int: O tipo int está compreendido entre -2,147,483,648 <= x <= 2,147,483,647. Geralmente esse tipo é usado como padrão para valores inteiros. E muitas vezes, para os valores que seu programa usará, este tipo dá e sobra!
  • long: Um valor do tipo long pode estar entre 9,223,372,036,854,775,808 <= x <= 9,223,372,036,854,775,807. Como você pode ver, este tipo é usado quando precisar guardar valores realmente grandes que o int não poderia fazê-lo.
  • float: O intervalo de números deste tipo é complicado de determinar, apenas saiba que ele possui 32 bits de precisão. Ele é usado para representar os números reais, não só inteiros mas também os fracionários. O formato desse tipo de número é normalmente chamado de floating point ou ponto flutuante. Eles podem representar números com uma boa precisão fornecendo uma aproximação para valores imensos. A forma como são representados pela linguaguem é um assunto muito interessante, recomendo que você procure algo sobre se ainda não conhece. Obs.: Este tipo nunca deve ser usado para valores realmente precisos, como moeda por exemplo. Para isto use a classe java.math.BigDecimal.
  • double: Assim como o float, o double representa números floating point. A diferença é que ele possui 64 bits de precisão. Para valores decimais (não inteiro) esse tipo é a melhor escolha. Como mencionado anteriormente, ele também não pode ser usado para representar valores de moeda.
  • char: O tipo char representa um único caractere Unicode. Unicode é um padrão para representar caracteres utilizando números inteiros de 16 bits (sem sinal). Assim ele pode armazenar o mesmo tamanho de informação que um short poderia, exceto que ele sua faixa é apenas números positivos. Pode-se digitar valores Unicode utilizano o prefixo "\u".
  • boolean: Esse tipo de dado só tem duas possibilidades: false ou true. Ele representa um bit de informação, embora seu "tamanho" não é algo precisamente definido. Desta forma valores booleanos podem ser somente uma das possibilidades citadas, nunca tente usar 0 ou 1! Outras linguagens como c++ aceitam isto, mas Java não.
É importante saber a sequência: byte, short, int, long, float, double. Lembre que double é maior que float, o próprio nome diz que é o dobro de precisão.
Outro detalhe é que todos tipos numéricos possuem sinal, isto é, podem ser tanto positivos quanto negativos e que isto afeta seu intervalo.
Como disse no começo do tópico, os valores são guardados em formato binário (001011...), sendo assim precisamos de um desses bits para definir o sinal do número. Este bit será o que se encontra mais a esquerda do número. Por exemplo: Temos um byte 00010011. O primeiro zero a esquerda representa o sinal. Sobram sete bits para representar o número, ou seja, 2^7 = 128 possibilidades.
Portanto, o byte pode representar valores entre -128 <= x <= 127, ou melhor: de -128 a -1 e de 0 a 127. Também podemos dizer que há 256 valores aí, metade negativa e metade -1 positiva. Menos um porque os positivos começam pelo zero, e ele é considerado um binário positivo.
A fórmula para calcular o intervalo mínimo (negativo) é -2^(bits - 1) e o máximo (positivo) é 2^(bits - 1) - 1.
Lembrando também que em Java não existe a palavra unsigned como em c++. Isto que dizer que todos valores devem respeitar as faixas permitidas como foi mostrado anteriormente. Não tente fazer algo como byte b = 128; sem fazer nenhuma conversão.

Bom, por hoje é só e bons estudos!

9 comentários: