Arithmetics promotion + binaries operations

7 respostas
D

Baseado na Arithmetic promotion , e binaries operations…que diz que qualquer operação realizada com um operando int , cujo o outro operando nao seje um double, float ou long , resulta em um int…
porque isso acontece (compila)???

char i = 'u0061' /4  ;
char i2  = 5 + '177';
char i22  = '177' + 5;		
char i3  = 5 + '177';
char i4 = 5 % '177' ;
char i44 = '177' % 5 ;

Obrigado! :lol:

7 Respostas

D

o que eu devo levar em consideração aqui ??

se o resultado caberá dentro do tipo …?

ou as regras de assigment (wideing operations - unary operators e binary opeartors) ???

porque pelo que eu to vendo nestas operações…as regrsa nao foram levadas muito em consideração…porque com opoderia uma operação com dois inteiros…caber dentro de um char??

o que eu to me confundindo???

valeu!

D

“Duque”:
Baseado na Arithmetic promotion , e binaries operations…que diz que qualquer operação realizada com um operando int , cujo o outro operando nao seje um double, float ou long , resulta em um int…
porque isso acontece (compila)???

char i = '\u0061' /4  ;
char i2  = 5 + '\177';
char i22  = '\177' + 5;		
char i3  = 5 + '\177';
char i4 = 5 % '\177' ;
char i44 = '\177' % 5 ;

Obrigado! :lol:

eu tava achando que isso somente poderia acontecer quando eu declarasse e inicializasse uma variavel…

mas se eu fizer assim :

i = '\u0061' /4  ;
i2  = 5 + '\177';
i22  = '\177' + 5;		
i3  = 5 + '\177';
i4 = 5 % '\177' ;
i44 = '\177' % 5 ;

tbm funciona…

porque será…??

ninguém ?? :cry:

D

???

vamorim

Olá Duque.

Como você sabe, o resultado de uma operação aritmética de byte, short, char e int sempre retorna um int. Dessa forma o mais comum seria fazer:

char i = (char) ('u0061' /4);
char i2  = (char) (5 + 'u0177');
char i22  = (char) ('u0177' + 5);      
char i3  = (char) (5 + 'u0177');
char i4 = (char) (5 % 'u0177') ;
char i44 = (char) ('u0177' % 5) ;
Só que para atribuições com expressões que apenas contenham literais, o  compilador já sabe de antemão se o resultado ultrapassa o limite do tipo em questão.  Se não ultrapassa, ele faz a conversão automática. Senão, indica erro. Agora olhe isso:
char x = 5;
char c = x + 'u0117';
Dessa vez, não compila pois existe a possibilidade do valor de x ser grande o suficiente para c ultrapassar o valor.  Mas o resultado de x + 'u0117' só é obtido em tempo de execução. O compilador não sabe, a priori, se vai estourar o limite ou não. Dessa forma, ele exige a converção explícita.  :wink:
D

umm…certo…acho que entendi…

da mesma foram que ele saberia calcular…esta expressao…

mas o que vc me diria entao

char x = 5;
char c = (char) x + ‘u0117’;

depois desta operacao…:(que compilaria perfeitamente…)

c+=’\u0117’; (implicitamente c = c + ‘\u0117’; )

isso iria causar overflow tbm concorda??

entaum , resumindo, a JVM seria responsavel por cuidar em tempo de compilacao destas operacoes correto??

obrigado!

vamorim

Na verdade,

char x = 5;
char c = (char) x + 'u0117';

não compila. O que compila é

char x = 5;
char c = (char)(x + 'u0117');

pois a coerção tem precedência sobre a adição. :wink:

Agora olha que interessante. :shock: Isso não compila:

c = c + 'u0117';

Mas isso compila:

c += 'u0117';
Parece estranho, mas faz sentido. Olha .  A primeira não compila pois do lado direito  uma expressão aritmética com variáveis. Logo, como o maior tipo em questão é um [b]char[/b], a expressão retorna um [b]int[/b].  até aqui tudo bem. É iqual ao exemplo acima,  que no lugar do [b]x[/b] é um outro [b]c[/b].  Mas funciona da mesma forma. 

Bom, mas para entender pq a segunda funciona, primeiro é bom lembrar que a semântica dos dois códigos é a mesma. Porém internamente, a execução é diferente, sendo o código com o operador [b]+=[/b] um pouco mais eficiente. Ok, mas o que está em questão é que como no segundo código  uma expressão que  contém literais char,ela vai retornar [b]char[/b] ao invés de [b]int[/b].    :)
vamorim

Essa barra dentro de ‘u0117’ não sai de jeito nenhum! :smiley:

Criado 7 de fevereiro de 2004
Ultima resposta 16 de fev. de 2004
Respostas 7
Participantes 2