Pesquisar

sexta-feira, 16 de janeiro de 2009

Java e os tipos sem sinais (unsigned types)

"A grande maioria dos desenvolvedores Java (bem como outras linguagens tipadas) quando necessitam representar algum número inteiro provavelmente usam int. Antigamente as pessoas tinham maiores preocupações com a quantidade de memória disponível, hoje nem tanto. Contudo há uma nova gama de aplicações pra celular surgindo e nesses casos otimização é uma obrigação."
(alguém me disse isso em algum momento...)

Se fossemos criar um atributo pra representar o número de cadeiras numa sala (tendo em vista que está sala não suporta mais de 240 cadeiras) poderíamos usar int, short ou byte. (claro que aqui caberiam outros tipos como char, String, double... )

Usar int ou short seria desperdício de memória!
Logo podemos utilizar byte?!

Nem tão rápido, 1 byte pode caber "256" números diferentes...
Em Java o byte tem 256 "posições" mas essas são preenchidas com os seguinte números -127 a 127.

Ou seja se você somar:
byte x = 127;
byte y = (byte)(x + 1);
System.out.println("x="+x);
System.out.println("y="+y);
você terá, ao invés de 128, y = -127.

O Wraparound do tipo byte
Com sinal:
-127 .. -100 .. 0 .. 1 .. 127 (127 + 1 == -127)

Sem sinal:
0 .. 100 .. 200 .. 255 ( 255 + 1 == 0)

Como extrair o byte sem sinal de um byte em Java? (tem como retornar o valor sem sinal?)

Simplesmente :
public static short readUnsignedByte(byte value){
return (short) (value & 0xff);
}

Se você passar -127 o método vai devolver o 128 e assim por diante. (claro que o retorno é short e não byte.)

Nenhum comentário: