Tamanaho de variaveis

Bom Dia! Desculpem minha ignorancia, mas estou com uma dúvida que é a seguinte:

byte - Tamanho de 8 bits com sinal. Valores de ? 128 a + 127.
short - Tamanho de 16 bits com sinal. Valores de ? 32.768 a + 32.767.
int - Tamanho de 32 bits com sinal. Valores de ? 2.147.483.648 a + 2.147.483.647.
long - Tamanho de 64 bits com sinal. Valores de ? 9.223.372.036.854.775.808 a + 9.223.372.036.854.775.807

isso significa que eu no byte eu posso ter um numero que vai de -128 a 127 e assim por diante ? Pq um CNPJ por exemplo talvez não suporte um tipo inteiro já que possuui somente 14 numeros? Desde já, grato.

Um CPF ou um CNPJ devem ser guardados como long ou como string. Eles não cabem em um int.

Ok. Mas eu quero entender pq? Como é calculado esse tamanho?

O tamanho é de acordo com a quantidade de bits de cada tipo, e a representação binária interna é em complemento para dois.

bytes tem 8 bits, short e char tem 16 bits (no caso de char, não tem números negativos), int tem 32 bits, long é 64 bits.

Quer saber mesmo?

Para saber quantos digitos tem um número, ache a parte inteira do logaritmo decimal desse número, e some 1.

Por exemplo, para o número 2^14 (16384), cujo logaritmo decimal é 4,2144199392957367329923445261429, a parte inteira do logaritmo é 4. Somando 1, você tem 5. Portanto, você precisa de 5 dígitos para representar 2 ^ 14.

Para o número 2 ^ 63 - 1 (que é o maior long positivo), o logaritmo decimal é 18,964889726830815298418464065565, portanto você precisa de 19 dígitos para representar esse número.

Entretanto, você precisa saber qual é o maior número, com todos os dígitos 9, que cabe em um determinado número. Isso você diria que é o “número de dígitos que cabe em um determinado número”. No caso do long, seriam 18, não 19 dígitos.

Números são objetos da matemática usados contar e para medir. CPFs, CNPJs, RG, etc, não são números. Não somamos CPFs, nem dividimos, nem multiplicamos, muito menos subtraimos CNPJs.

Identificadores de documentos são sequencias de caracteres, de 0 a 9, portanto use Strings para representá-los internamente, ou mesmo arrays de char. Encapsule esta representação dentro de um objeto próprio para eles.

Mas existem situações onde precisamos realizar o cálculo de CPF [por exemplo] para verificarmos se o informado é válido.
Nesse caso não podemos trabalhar com Strings diretamente.
Sendo necessário no mínimo uma conversão.

[quote]Mas existem situações onde precisamos realizar o cálculo de CPF [por exemplo] para verificarmos se o informado é válido.
Nesse caso não podemos trabalhar com Strings diretamente.
Sendo necessário no mínimo uma conversão. [/quote]

Vc transforma partes do cpf em números, o cpf todo em si não é um número. Numeros não são separados por pontos e traço.

Mas existem situações onde precisamos realizar o cálculo de CPF [por exemplo] para verificarmos se o informado é válido.
Nesse caso não podemos trabalhar com Strings diretamente.
Sendo necessário no mínimo uma conversão.[/quote]

Cálculo de dígito verificador em módulo 11 ainda assim não considera o número inteiro, a verificação é feita dígito a digito. Usando int ou long, você teria que dividir o número várias vezes para pegar cada dígito, e fazer os cálculos. Usando array de char/byte, já fica tudo dividido.

Aliás nem me importo muito em guardar como long ou String, o ideal mesmo é encapsular em uma classe própria para eles, para estas implementações ficarem escondidas e transparentes.

[quote=rbmenezes]Bom Dia! Desculpem minha ignorancia, mas estou com uma dúvida que é a seguinte:

byte - Tamanho de 8 bits com sinal. Valores de ? 128 a + 127.
short - Tamanho de 16 bits com sinal. Valores de ? 32.768 a + 32.767.
int - Tamanho de 32 bits com sinal. Valores de ? 2.147.483.648 a + 2.147.483.647.
long - Tamanho de 64 bits com sinal. Valores de ? 9.223.372.036.854.775.808 a + 9.223.372.036.854.775.807

isso significa que eu no byte eu posso ter um numero que vai de -128 a 127 e assim por diante ? Pq um CNPJ por exemplo talvez não suporte um tipo inteiro já que possuui somente 14 numeros? Desde já, grato.[/quote]
O uso dos tipos nativos de dados numéricos, visa otimizar o uso de memória da JVM.
Documentos em geral são índices de cadastros, alguns tem agregados dígitos validadores, mas fundamentalmente são índices e são armazenados como indices.
Reconheça o escopo de cada aplicação e utilize adequadamente.
Abaixo listo os tipos nativos de Java:

[list]boolean (true ou false): Valores Booleanos[/list][list]char (0 a 65535): Caracteres representados em 16 bits[/list][list]byte (-128 a 127): Inteiro de 8 bits[/list][list]short (-32768 a 32767): Inteiro de 16 bits[/list][list]int (-2E31 e 2E31): Inteiro de 32 bits[/list][list]long (-2E63 e ( 2E63 - 1) ): Inteiro de 64 bits[/list][list]float 1.40239846E-46 e 3.40282347e+38): Ponto flutuante de precisão simples[/list][list]double (4.94065645841246544E-324 e 1.7976931348623157E+308): Ponto flutuante de precisão dupla[/list][size=9]Fonte: http://infoblogs.com.br/view.action?contentId=167793&Tipos-de-dados-nativos-da-linguagem-Java.html[/size]

Legal Bruno!

Ok. Valeu pela informação.