Dúvida Questão simulado

8 respostas
sandro_maximo

:shock: Fiquei em dúvida sobre a questão abaixo:

public static void main(String[] args) {

final short s1 = 1; // 1

final long l1 = 1  // 2

final char c1 = 1;  // 3

byte b1 = s1;       // 4

byte b2 = c1;       // 5

byte b3 = 1;        // 6

byte b4 = l1;       // 7

byte b5 = 1.0;      // 8

byte b6 = 1.0d;     // 9

}}

Nesta questão ocorre um erro de compilação na linha 7, quando tenta-se atribuir um tipo long a um tipo byte.

Dùvida:

Entendo que um long tem 64 bits e um byte tem 8 bits, logo ocorre o erro.
Porém não entendo por que não ocorre o mesmo erro no caso da linha 4, onde está se atribuindo um valor short a um tipo byte, visto que o short tem 16 bits???

8 Respostas

Luiz-SP

vc digitou errado ou a linha sete é assim mesmo, se for é por causa do | que ela não compila…

jordy

Se você tirar o modificador final da linha 1, dá erro de compilação na linha 4.

Fabricio_Cozer_Marti

unh … naum entendi tb naum!

será que existe algum limite de bits para o compilador acusar erro de precisão?

será que isso só acontece quando tentar fazer um cast implicito para long??

alterei a linha :
final long l1 = 1 // 2

para:
final int l1 = 1 // 2

e o compilador naum reclamou ???

alguem explica?
Canhoto ? Vc sabe essa modernidade?

danieldestro

Como as três primeiras são FINAIS, o valor não vai mudar mais. Então o compilador sabe qual o valor daqueles identificadores. Como eles são valores menores do que o limite máximo de cada outro tipo abaixo, ele funciona.

É o mesmo caso de:

byte b = 1;

1 é inteiro (int), mas está abaixo de 127 (limite de byte).
Imagine que chato seria fazer:

byte b = (byte) 1;

Fabricio_Cozer_Marti

certo,

mas na linha 2

final long l1 = 1; // 2

o valor de l1=1 é suportado por um byte não eh?

e porque então ele deu erro de compilação?

pela lógica achava que não deveria dar…

entendeu a dúvida?

D

Tentando entender o fato, encontrei na Especificação da Linguagem Java o seguinte:

5.2 Assignment Conversion
Assignment conversion occurs when the value of an expression is assigned to a variable. (…) a narrowing primitive conversion may be used if all of the following conditions are satisfied:

  1. The expression is a constant expression of type byte, short, char or int.
  2. The type of the variable is byte, short, or char.
  3. The value of the expression (which is known at compile time, because it is a constant expression) is representable in the type of the variable.

If the type of the expression cannot be converted to the type of the variable by a conversion permitted in an assignment context, then a compile-time error occurs.


Nesse caso, eu posso fazer uma “conversão redutiva” na atribuição se a expressão atribuida for uma constante byte, short, char ou int.
Variaveis finais são tratadas como constantes.
Mas deve ser observado, que ser eu tivesse

ocorreria erro de compilação em (condição 3):

danieldestro

1 é uma literal do tipo int, 32 bits. long são 64 bits.
Então um long recebe 1 numa boa.
É o tal do widenning e narrowing.

sandro_maximo

Valeu Pessoal,

Essa questão é realmente boa !

Obrigado pelo esclarecimento.

Sandro Maximo

Criado 18 de fevereiro de 2005
Ultima resposta 19 de fev. de 2005
Respostas 8
Participantes 6