Literais [resolvido]

16 respostas
J

Olá gente, estou estudando para a certificação e me deparei com uma dúvida esquisita.

bom, é fato que:

1º Todos os literais inteiros são int.
2º Todos os literais quebrados são double.

Segindo essas regras temos:

2º regra

o código acima não compila pois 0.5 é um literal quebrado, portanto um double, então não pode ser colocado em uma variavel float sem ser convertido (até aqui tudo bem)

1º regra (aqui é que fica minha dúvida)

O código acima compila !!!

Não deveria, pois, segundo o livro da Kathy, que foi o mesmo livro que eu peguei a primeira regra, diz que um literal inteiro é sempre um tipo int, portanto baseando-se na segunda regra, o código acima não poderia compilar, pois sete é um literal int e não pode ser colocado dentro de uma variavel byte implicitamente.

Alguém pode me explicar pq q o código acima funcionou?

BRigadão gente

16 Respostas

rodrigo.bossini

Realmente, também acho que essa parte no livro da Kathy (6 edição) está um tanto vaga.

Primeiro, o livro cita o problema de atribuir valores “quebrados” para uma variável do tipo float.

Depois, cita o exemplo do byte dizendo que se o valor atribuido ao byte for menor que 128, então o código compila normal, pois o compilador
sabe o “range” das variáveis.

Se

compila, então:

também deveria compilar, não?

J

Creio que deveria compilar sim…

mas quanto ao lance do range dos integers eu nunca tinha parado para pensar …
realmente … ele reconhece o tamanho do número em tempo de compilação e veerifica se ele pode ser inserido na variavel
porém para numeros quebrados ele não faz isso …

talvez seja esa a explicação …

rodrigo.bossini

Pois é, se você atribuir um literal inteiro a um float (1 por exemplo, ao invés de 1.0) ele compila normalmente.

Acho que é impossível para o compilador determinar o range de números em ponto flutuante…vai saber.

J

sim … essa ipótese é válida …
mas seria legal a gente ter certeza … será que se ligar pra lá eles nun explicam ? ahuahauhauhauahu

helpDesk ahuah

rodrigo.bossini

Qual versão do livro você tá usando?

J

java 5

exame 310-055

2ª edição revisada

rodrigo.bossini

eu to com a versão 6 em inglês…pelo visto essa parte ainda tá igualzinha…hehe

J

ah cara … não deve mudar MUITOOO de livro pra livro
tem muitos detalhes … para mudar a toda a versão …

eles fazem um upgrade do livro … não deve mudar muita coisa não ahuahu… senão o dim dim arrecadado nun ia compensar ahu

rodrigo.bossini

verdade…até pq o conteúdo da prova 5 não mudou quase nada pra prova 6…aliás, vc tá planejando fazer a versão 5 da prova?

J

farei a java 5 sim

jah comprei o voucher … e ele vai vencer em julho … mas pretendo marcar a prova agora para fevereiro … estou aproveitando q to de ferias da faculdade … e fui mandado embora agora em 30 de dezembro … vo pegar janeiro pra revisar firme os capitulos … pois já li o livro todo, fiz resumo de alguns capitulos … mas agora to revisando … tentarei terminar a minha revisão agora em janeiro e estar preparado para a prova em fevereiro …

me add no msn … a gente está lotando o forum sem necessidade rsr

[email removido]

a gente compartilha umas duvidas XD

Djonatah

POrque funciona?
Bom acredito que atribuindo isso, o compilador sabe o range de números que pode ser atribuido

Já isso é mais complicado de saber, ele pode ter uma infinidade de casas decimais…

ou poderia ter uma parte decimal um pouco maior tbm!

Talvez a checar elementos como bfloat sejam complexos de serem implementados. Então, fizeram o check apenas para double.
Não sei, é a minha opinião…

Abraços

rubinelli

O problema não é range, é precisão. Quando você passa de double para float, reduz o número de casas decimais. Por isso a conversão não pode ser feita automaticamente.

Reilander

Rubinelli está correto. Tudo gira em torno de perda de informação.

Enquanto o compilador consegue verificar e validar que o literal 7 (portanto, do tipo inteiro) pode ser convertido pra byte sem perda de informação, ele o faz. E assim o fará sempre que puder.

No entanto, criando uma variável int com o valor inicial 7 e atribuindo ela a um byte ocorrerá um erro de compilação, porque o compilador não pode garantir a conversão sem perda de informação (o valor dentro da variável poder ser um valor maior que 128, portanto, fora do escopo de um byte).

O mesmo não ocorre com os literais do tipo double. Um float não pode receber um double sem perda de informação.

J

realmente … a questão da perda de informação é uma explicação plausivel

bom … acho q o caso está resolvido rsrs

valew gente

C

javando:
Olá gente, estou estudando para a certificação e me deparei com uma dúvida esquisita.

bom, é fato que:

1º Todos os literais inteiros são int.
2º Todos os literais quebrados são double.

Segindo essas regras temos:

2º regra

o código acima não compila pois 0.5 é um literal quebrado, portanto um double, então não pode ser colocado em uma variavel float sem ser convertido (até aqui tudo bem)

1º regra (aqui é que fica minha dúvida)

O código acima compila !!!

Não deveria, pois, segundo o livro da Kathy, que foi o mesmo livro que eu peguei a primeira regra, diz que um literal inteiro é sempre um tipo int, portanto baseando-se na segunda regra, o código acima não poderia compilar, pois sete é um literal int e não pode ser colocado dentro de uma variavel byte implicitamente.

Alguém pode me explicar pq q o código acima funcionou?

BRigadão gente

O livro diz o seguinte:

“O código a seguir é válido”:

“mas somente porque o compilador compacta automaticamente o valor literal para o tamanho de um tipo byte,
em outras palavras, o compilador executa a conversão. O código anterior é identico ao seguinte:”

[]´s

rodrigo.bossini

Verdade…

mas pq o compilador tbm não faz isso qdo tentamos colocar um double num float?

Criado 3 de janeiro de 2009
Ultima resposta 12 de jan. de 2009
Respostas 16
Participantes 6