O que se deve fazer quando se precisa usar valor numérico que não faz parte da capacidade da linguagem?

Eu não sei se os professores dos cursos superiores e técnicos de nível de 2° grau de programação explicam sobre as seguintes perguntas que eu farei a seguir sobre a capacidade de armazenamento de uma linguagem.

Está escrito no livro Programação para Iniciantes - Aprenda Lógica de Programação com Java:

2.1. Tipos de dados existentes

No Java nós temos vários e vários tipos de dados, mas dentre esses muitos tipos, temos alguns que são principais. Antes de mencioná-los, vou agrupá-los em 3 categorias:

• Numéricos
• Textos
• Lógicos

Dentro dos numéricos nós ainda temos dois subgrupos:

• Inteiros
• Decimais

Quanto aos tipos inteiros, nós temos:

• byte (armazena valores de -128 até 127)
• short (vai de -32768 até 32767)
• int (ocupa o intervalo de -231 a 231 -1)
• long (intervalo de -263 a 263 -1)

Sobre a diferença, como você pode notar acima, basicamente, é a capacidade de
cada um.

Referência: https://cafe.algaworks.com/livro-logica-de-programacao/

O que se deve fazer quando se precisa usar valor numérico que não faz parte da capacidade da linguagem?

Por exemplo, a faixa de abrangência -40.500 até 40.500 não faz parte da capacidade de armazenamento dos tipos de dados inteiros do Java.

O que se deve fazer para usar em Java o valor 40.500?

Ou é impossível usar esse valor em Java por causa da capacidade de armazenamento da linguagem?

EDIT: Quanto aos tipos inteiros, nós temos:

• byte (armazena valores de -128 até 127)
• short (vai de -32768 até 32767)
• int (ocupa o intervalo de -2 elevado a 31 a 2 elevado a 31 -1)
• long (intervalo de -2 elevado a 63 a 2 elevado a 63 -1)

1 curtida

O que diz o livro que você está lendo?
O que diz o exercício que você está respondendo?
O que acontece se executar a classe abaixo?

public class Foo {
    public static void main(String[] args) {
        int x = 100000;
        long y = 99999999999;

       System.out.println("Valor de x: " + x);
       System.out.println("Valor de y: " + y);
    }
}
3 curtidas

Vamos la. No java vc tem o tipo byte.

Vc precisa ler o conteudo de um arquivo que tem, por exemplo, 24kb. Como vc faz?

vc usa mais de um byte ora.

portanto existem diversas formas de reprensentar a mesma quantidade numerica, usando mais de uma variavel. por exemplo vc tem o numero 123456789
vc pode salvar isso como sendo um array de short/int/etc como {1,2,3,4,5,6,7,8,9}

se vc encapsular esse array em uma classe e definir operações como a soma, vc tem algo que se comporta como numero.

como vc soma 123456789 + 2 ?

{1,2,3,4,5,6,7,8,9} + { 2 }

vc vai começar de tras, 9+ 2 = 11. passou de 10, então vc tem o “vai um”

{1,2,3,4,5,6,7,9,1}

faz sentido certo? agora vc vai me dizer que isso usa “memoria demais”. sim. vc tem diversas tecnicas para reduzir isso. no caso eu defini numeros de 0 a 9 para ficar didatico mas vc pode usar a sua imaginação

edit: eu movi isso para a pasta programação pois acredito que seja mais apropriada. vamos tentar focar na discussão desse problema ok?

2 curtidas

@peczenyj,

Ok.

1 curtida

Corrigindo:
int (ocupa o intervalo de -2^31 a 2^31 -1)
ou seja
vai de -2.147.483.648 à 2.147.483.647

long (intervalo de -2^63 a 2^63 -1)
ou seja
vai de -9.223.372.036.854.775.808 à 9.223.372.036.854.775.807

Assim como 1 short equivale à 2 byte 1 int equivale à 2 short ou 4 byte e assim por diante.

Se você precisa de números maiores, você terá que criar seu próprio tipo de dado.
Por exemplo com dois long você já consegue representar os números no intervalo de -2^128-1 até 2^128-1

2 curtidas

@staroski,

Eu simplesmente copiei e colei o que está escrito no PDF do Algaworks, se você baixar esse PDF, você verá que eu estou falando a verdade.

De onde você aprendeu que os tipos de dados inteiros int e long ocupam os intervalos que você citou acima?

Quando colou aqui por alguma limitacao de sistema ficou errado 263 ao inves de 2 elevado a 63. Na apostila está correto como na fonte que é a documentação: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

4 curtidas

Vamos la

Antigamente, cada processador podia definir os seus tipos, tamanhos, limites, sem problema. Inteiro até não tem muita diferença mas vc vai ver algumas implementações de ponto flutuante bem curiosas antes de haver uma normatização via comunidade internaciona - exemplo norma IEEE 754

Alguns processadores como o 6502 tinham suporte a numeros de ponto fixo. basicamente vc diz “esse tipo tem x casas decimais”. e acabou. se vc faz programas que envolvem dinheiro, isso é uma mão na roda pq vc só precisa de 2 casas decimais ( inclusive vc não pode usar float para representar dinheiro em alguns tipos de programas sob risco de MULTA ).

Esses tipos, formatos, limites, etc, foram sendo adotados aos poucos pelos fabricantes. Perceba q pouco se fala se os tipos são big endian ou little endian justamente pq hoje em dia existe uma tendencia de abstrair esse tipo de detalhe - isso vai ser relevante quando vc lê uma sequencia de bytes vindo de outro sistema.

Em resumo: vc precisa estudar a historia dos sistemas. Começa la pelo sistema binario, algebra de boole e codigo Baudot - que isso tem um profundo impacto nos sistemas de hoje.

Edit as linguagens de programação possuem uma especificação formal. la vc vai descobrir os formatos e limites. como que isso vai ser representado na CPU é um OUTRO trabalho, que vai envolver como que a maquina virtual e/ou compilador trabalham.

nada impede vc ter uma maquina virtual cujo tipo primitivo que suporte numeros tão grandes quanto vc pode colocar na memoria. basta especificar como. ou dizer que o tipo X é definido pela arquitetura-alvo.

alias a maquina virtual java é uma maquina de pilha, enquanto a cpu é uma maquina de registradores. vc não precisa se preocupar com esses detalhes pq vc trabalha numa abstração maior: objetos.

2 curtidas

Matemática:

int: -2^31     = -2.147.483.648
      2^31 - 1 =  2.147.483.647

long: -2^63     = -9.223.372.036.854.775.808
       2^63 - 1 =  9.223.372.036.854.775.807

Indiferente disso, sempre consulto material oficial e principalmente a especificação da API.

Veja:
Byte.MIN_VALUE
Byte.MAX_VALUE

Short.MIN_VALUE
Short.MAX_VALUE

Integer.MIN_VALUE
Integer.MAX_VALUE

Long.MIN_VALUE
Long.MAX_VALUE

2 curtidas

É verdade, quando colou aqui ficou errado.

Eu editei este erro, eu escrevi na primeira mensagem que eu coloquei nesse tópico:

• int (ocupa o intervalo de -2 elevado a 31 a 2 elevado a 31 -1)
• long (intervalo de -2 elevado a 63 a 2 elevado a 63 -1)